使用伪经典继承设置prototype属性

时间:2014-06-12 12:08:19

标签: javascript inheritance

了解javascript中的继承我遇到了伪经典继承。以下是我使用的两个函数构造函数:

function MySuperConstructor() {

}

MySuperConstructor.prototype = {
    constructor: MySuperConstructor,

    myMethod: function() {
       console.log("method called");
    }

}

function MyConstructor() {

}

我感到困惑的是这两种方法之间的区别:

MyConstructor.prototype = Object.create(MySuperConstructor.prototype);

MyConstructor.prototype = MySuperConstructor;

有什么不同吗?

1 个答案:

答案 0 :(得分:3)

存在显着差异。在谈论"原型时,为了消除混乱。函数的属性,以及用于继承的对象原型,我将调用对象原型[[Prototype]]

请注意,设置属性"原型"一个功能 - MyConstructor.prototype = SomeObject确定通过[[Prototype]]创建对象new Function时的内容:

MyObj = new Constructor(); MyObj的[[Prototype]]Constructor.prototype

现在为您的代码:

PrototypeObj = Object.create(MySuperConstructor.prototype);
MyConstructor.prototype = PrototypeObj;
MyObj = new MyConstructor();

这里是[[Prototype]]的{​​{1}}链:

MyObj

如果您使用第二个代码段:

MyObj -> PrototypeObj -> MySuperConstructor.prototype(the object with myMethod) -> ...

这里是MyConstructor.prototype = MySuperConstructor; MyObj = new MyConstructor(); 的{​​{1}}链:

[[Prototype]]

在第二种情况下,您定义并设置为MySuperConstructor.prototype的对象根本不在MyObj的原型链中。