this.function和prototype.function有什么区别?



给定简单的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"]

最新更新