21

给定简单的 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);

原型上定义的函数:

//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);
4

1 回答 1

42

原型上的函数只创建一次并在每个实例之间共享。在构造函数中创建的函数被创建为使用构造函数创建的每个新对象的新对象。

作为一般规则,函数应该在原型上,因为它们通常不会针对相同类型的不同对象进行修改,这对内存/性能有轻微的好处。其他属性如对象和数组应该在构造函数中定义,除非你想创建一个共享的静态属性,在这种情况下你应该使用原型。

它更容易看出与普通对象或数组而不是函数的区别

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"]
于 2013-03-27T12:46:20.307 回答