我正在搞乱原型链并注意到我无法解释的事情。我还在学习所有这些,所以这可能是我犯的错误。我正在尝试做一些多继承,就像许多其他人一样。我注意到原型对象看起来很像哈希/字典,我想,为什么不使用像underscore.extend这样的东西将多个原型对象合并为一个。
function A(){this.value="A";};
A.prototype.funcA = function (){console.log(this.value);}
function B(){this.value="B";};
B.prototype.funcB = function (){console.log(this.value);}
function C(){
// fix constructor
this.constructor = C;
// 'inherit' properties
A.call(this);
B.call(this);
};
// gobble up the prototype chains of A and B
C.prototype = new underscore.extend(A.prototype,B.prototype);
C.prototype.funcC = function (){console.log(this.value);}
var c = new C();
> c instanceof C
true
> c instanceof A
true
> c instanceof B
false
我真的很惊讶在这里得到一个真实的。谁能解释一下这里发生了什么?
更新 我按照建议从代码中删除了下划线的extend方法,这样做效果更好。谢谢!
function extend(destination, source) {
for (var property in source) {
if (source.hasOwnProperty(property)) {
destination[property] = source[property];
}
}
return destination;
};
function A(){this.value="A";};
A.prototype.funcA = function (){console.log(this.value);}
function B(){this.value="B";};
B.prototype.funcB = function (){console.log(this.value);}
function C(){
this.constructor = C;
A.call(this);
B.call(this);
};
var destination = {};
destination = extend(destination,A.prototype);
destination = extend(destination,B.prototype);
C.prototype = destination;
C.prototype.funcC = function (){console.log(this.value);}
var c = new C();
> c
{ constructor: [Function: C], value: 'B' }
> c instanceof A
false
> c instanceof B
false
> c instanceof C
true
答案 0 :(得分:2)
JavaScript中没有多重继承,因为一个对象只能有一个原型。为了证明它足以看到ECMAScript 5 Object.getPrototypeOf
方法当然只返回一个值。对于年龄较大的口译员,您可以尝试__proto__
obj.constructor.prototype
的{{1}}属性(非标准)。
你所做的例子让你有可能拥有两个不同原型的所有特征,但它会制动原型链 - 这就是为什么instanceof
运算符为A和B返回false的原因。事实上A的原型或者B不是你的对象的原型,而是你使用extend
函数创建它们的混合。函数名称非常具有误导性(但是这些名称被一些框架和库使用) - 因为我们没有扩展任何对象(在面向对象的编程意义上) - 我们构建了两个对象的混合 - 这是完全不同的设计图案。
指出主题 - 如果您正在试验对象和原型继承 - 尝试使用Object.create
方法(ECMAScript 5)。在这种情况下它非常有用。