标签:
把方法写在构造函数内的情况我们简称为函数内方法,把方法写在prototype
属性上的情况我们简称为prototype上的方法
new
出来的对象需要我们操作构造函数内部的私有变量的话, 我们这个时候就要考虑使用函数内的方法.prototype
上添加这些方法. 这种情况下我们代码的内存占用就比较小.// 构造函数A
function A(name) {
this.name = name || ‘a‘;
this.sayHello = function() {
console.log(‘Hello, my name is: ‘ + this.name);
}
}
// 构造函数B
function B(name) {
this.name = name || ‘b‘;
}
B.prototype.sayHello = function() {
console.log(‘Hello, my name is: ‘ + this.name);
};
var a1 = new A(‘a1‘);
var a2 = new A(‘a2‘);
a1.sayHello();
a2.sayHello();
var b1 = new B(‘b1‘);
var b2 = new B(‘b2‘);
b1.sayHello();
b2.sayHello();
写了两个构造函数,第一个是A
,这个构造函数里面包含了一个方法sayHello
;第二个是构造函数B
, 我们把那个方法sayHello
写在了构造函数B
的prototype
属性上面.
把方法写在构造函数的内部,增加了通过构造函数初始化一个对象的成本,把方法写在prototype
属性上就有效的减少了这种成本. 你也许会觉得,调用对象上的方法要比调用它的原型链上的方法快得多,其实并不是这样的,如果你的那个对象上面不是有很多的原型的话,它们的速度其实是差不多的
另外,需要注意的一些地方:
prototype
属性上定义方法的话,要牢记一点,如果你改变某个方法,那么由这个构造函数产生的所有对象的那个方法都会被改变.func1(); // 这里会报错,因为在函数执行的时候,func1还没有被赋值. error: func1 is not a function
var func1 = function() {
console.log(‘func1‘);
};
func2(); // 这个会被正确执行,因为函数的声明会被提升.
function func2() {
console.log(‘func2‘);
}
prototype
上的属性不会被序列化,可以看下面的代码:
function A(name) {
this.name = name;
}
A.prototype.sayWhat = ‘say what...‘;
var a = new A(‘dreamapple‘);
console.log(JSON.stringify(a));
我们可以看到输出结果是{"name":"dreamapple"}
原文来自:构造函数内的方法与构造函数prototype
属性上方法的对比
标签:
原文地址:http://www.cnblogs.com/hyea/p/5636082.html