给定简单的JS继承,这两个示例之间的基函数的实际区别是什么?换句话说,什么时候一个人应该选择在"这个"上而不是在原型上定义一个功能(或者反过来)?
对我来说第二个例子更容易理解,但是还有多少呢?
在this上定义的函数:
//base
var _base = function () {
this.baseFunction = function () {
console.log("Hello from base function");
}
};
//inherit from base
function _ctor() {
this.property1 = "my property value";
};
_ctor.prototype = new _base();
_ctor.prototype.constructor = _ctor;
//get an instance
var instance = new _ctor();
console.log(instance.baseFunction);
在prototype上定义的函数:
//base
var _base = function () {};
_base.prototype.baseFunction = function () {
console.log("Hello from base function");
}
//inherit from base
function _ctor() {
this.property1 = "my property value";
};
_ctor.prototype = new _base();
_ctor.prototype.constructor = _ctor;
//get an instance
var instance = new _ctor();
console.log(instance.baseFunction);
原型上的函数只创建一次,并在每个实例之间共享。在构造函数中创建的函数,对于用构造函数创建的每个新对象,都以新对象的形式创建。
作为一般规则,函数应该在原型上,因为它们通常不会针对相同类型的不同对象进行修改,这在内存/性能方面有一点好处。其他属性,如对象和数组,应该在构造函数中定义,除非你想创建一个共享的静态属性,在这种情况下,你应该使用原型。
与普通对象或数组相比,更容易看出它们之间的区别
function Foo(){
this.bar = [];
}
var fooObj1 = new Foo();
var fooObj2 = new Foo();
fooObj1.bar.push("x");
alert(fooObj2.bar) //[]
相对于:
function Foo(){
}
Foo.prototype.bar = []
var fooObj1 = new Foo();
var fooObj2 = new Foo();
fooObj1.bar.push("x");
alert(fooObj2.bar) //["x"]