Javascript类-构造方法和原型方法的区别
来源:互联网 发布:数据冗余类型 编辑:程序博客网 时间:2024/04/20 21:35
http://www.link888.cn/index.php?load=read&id=500
对Javascript来说,方法在本质上也是一种属性。
构 造方法 和构造属性一样,它是分别存储于每个实例之中的,相互之间是完全独立。
原型方法 和原型属性一样,他是存储于原型中的,每个实例中存储的实际上一 个指向原型的指针。
所有对原型方法的修改会影响到所有实例,而构造方法实际上只能通过实例来访问和修改,也只会影响到相应的实例。
先写结论:方法通常应该使用原型模式定义,并且在必要时通过原型来动态重定义,避免使用构造模式定义方法。
看看示例代码吧: 我们首先构造一个简单的类car,定义2个方法,分别是构造方式定义的constructFunction 和 原型方式定义的 prototypeFunction
function car(){
this.constructFunction = function(){
echo('This is constructFunction');
};
}
car.prototype.prototypeFunction = function(){
echo('This is prototypeFunction');
};
aCar = new car();
bCar = new car();
aCar.constructFunction();
aCar.prototypeFunction();
bCar.constructFunction();
bCar.prototypeFunction();
输出结果:
This is constructFunction
This is prototypeFunction
This is constructFunction
This is prototypeFunction
原型方法可以随时动态定义和修改,修改的方法当然是通过类的原型访问,通过重新定义原型方法可以影响到类的所有实例:
bCar = new car();
car.prototype.prototypeFunction = function(){
echo('This a new prototypeFunction');
};
aCar.prototypeFunction();
bCar.prototypeFunction();
输出结果为:
This a new prototypeFunction
This a new prototypeFunction
可以看到,即使在实例已经创建以后,对原型的修改也可以反映到影响到所有实例上来。
构造方法是无法通过原型来访问的,只能通过实例访问,也只能通过实例来重定义。下面代码尝试修改实例:aCar的方法constructFunction
bCar = new car();
cCar = new car();
// car.constructFunction() 尝试通过类或者类的原型访问构造定义的方法是无效的,会报错
// car.prototype..constructFunction() 尝试通过类或者类的原型访问构造定义的方法是无效的,会报错
aCar.constructFunction = function(){
echo('This a new constructFunction');
}
aCar.constructFunction();
bCar.constructFunction();
cCar.constructFunction();
输出结果:
This a new constructFunction
This is constructFunction
This is constructFunction
对实例aCar的构造方法和影响到了aCar而没有影响到其它实例
事实上,原型方法也是可以通过实例直接修改的,如果直接修改实例的原型方法会出现什么情况呢?
本 段开头已经指出:“每个实例中原形方法存储的实际上一个指向原型的指针”,如果你尝试修改实例的原型方法,就改变这个指针,使其指向新定义的方法函数;而 原型中的方法定义并没有受到影响。同时,指针既然转向,那么该实例的这个原型方法也就脱离了原型的定义,而成为一个独立方法。 通过下面的代码可以清晰的明白这种过程:
bCar = new car();
cCar = new car();
//修改aCar的原型方法 prototypeFunction
aCar.prototypeFunction = function(){
echo('This a new prototypeFunction');
}
//检查修改结果
aCar.prototypeFunction();
bCar.prototypeFunction();
cCar.prototypeFunction();
//修改原型方法 prototypeFunction ,就会发现奥妙之处了
car.prototype.prototypeFunction = function(){
echo('This a new prototypeFunction modified by prototype');
}
//检查修改结果
aCar.prototypeFunction();
bCar.prototypeFunction();
cCar.prototypeFunction();
输出结果:
//第一段的输出结果
This a new prototypeFunction //在修改aCar的原型方法prototypeFunction时,仅aCar受到了影响
This is prototypeFunction
This is prototypeFunction
//第二段的输出结果
//我们重新定义了car的原型方法prototypeFunction,但是aCar没有受到影响,aCar的方法prototypeFunction已经脱离了原型的影响。
This a new prototypeFunction
This a new prototypeFunction modified by prototype
This a new prototypeFunction modified by prototype
注意:直接修改实例的原型方法虽然是可行的,但是会带来代码上的混淆和混乱,要尽可能避免使用这种方式.
- Javascript类-构造方法和原型方法的区别
- javascript中的类方法、构造方法、原型方法的对比
- Javascript的类,构造函数和原型
- JS中的类方法、构造方法和原型方法的对比
- javascript中Object类原型对象的属性和方法
- Java方法和构造方法的区别
- 方法和构造方法的区别。
- 构造方法和普通方法的区别
- 构造方法和成员方法的区别
- 构造方法和成员方法的区别
- 构造方法和普通方法的区别
- Javascript 原型属性和原型方法
- JS中通过构造函数添加成员方法和通过原型法添加成员方法的区别
- ** Javascript 普通函数和构造函数的区别 && JS----构造函数与原型prototype 区别
- JavaScript 对象方法 类方法 原型方法的区别;私有属性 公有属性 公有静态属性的区别
- javascript对象方法、类方法、原型方法
- javascript的构造函数和原型
- javascript的原型和构造函数
- BASH语法详解
- strcpy ,strncpy ,strlcpy地用法
- 类内线程 接口类 IThread 实现
- 对于不允许使用开源标签进行select选中的js替代方法
- socket编程—TCP/IP
- Javascript类-构造方法和原型方法的区别
- Session过滤器
- 据说看完这21个故事的人,30岁前都成了亿万富翁。你是下一个吗?
- vi快捷键
- 芯故事 心感动:英特尔企业文化的力量
- java 读取配置文件(一)
- Android之TabHost的几种使用方法
- 从两道经典试题谈C/C++中联合体(union)的使用
- QThread 使用探讨(zz)