gpt4 book ai didi

javascript - 多重继承问题

转载 作者:行者123 更新时间:2023-11-29 22:30:23 25 4
gpt4 key购买 nike

我在弄乱原型(prototype)链,发现了一些我无法解释的事情。我仍在学习所有这些,所以这可能是我犯的一个错误。我正在尝试做一些多重继承,就像其他许多人一样。我注意到原型(prototype)对象看起来很像散列/字典,我想,为什么不使用类似 underscore.extend 的东西将多个原型(prototype)对象合并为一个。

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

我真的很惊讶能在这里得到一个 true。谁能解释一下这是怎么回事?

更新我按照建议从代码中删除了下划线的扩展方法,这样效果更好。谢谢!

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

最佳答案

JavaScript 中没有多重继承,因为一个对象只能有一个原型(prototype)。要证明这一点,请参阅 ECMAScript 5 Object.getPrototypeOf 方法,该方法当然只返回一个值。对于较老的解释器,您可以尝试简单地使用 obj.constructor.prototype__proto__ 属性(非标准)。

您所做的示例使您有可能拥有来自两个不同原型(prototype)的所有功能,但它会中断原型(prototype)链 - 这就是 instanceof 运算符为 A 和 B 返回 false 的原因。事实上A 或 B 的原型(prototype)不是您的对象的原型(prototype),而是您使用 extend 函数制作的它们的混合体。函数名称非常具有误导性(但是某些框架和库使用了这样的名称)-因为我们不扩展任何对象(在面向对象编程的含义中)-我们构建了两个对象的混合-这是完全不同的设计图案。

偏离主题 - 如果您正在试验对象和原型(prototype)继承 - 尝试使用 Object.create 方法(ECMAScript 5)。在这种情况下它非常有用。

关于javascript - 多重继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7264370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com