了解javascript中的继承我遇到了伪经典继承。以下是我使用的两个函数构造函数:
function MySuperConstructor() {
}
MySuperConstructor.prototype = {
constructor: MySuperConstructor,
myMethod: function() {
console.log("method called");
}
}
function MyConstructor() {
}
我感到困惑的是这两种方法之间的区别:
MyConstructor.prototype = Object.create(MySuperConstructor.prototype);
和
MyConstructor.prototype = MySuperConstructor;
有什么不同吗?
答案 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的原型链中。