多重继承问题

时间:2011-08-31 22:50:06

标签: javascript function-prototypes

我正在搞乱原型链并注意到我无法解释的事情。我还在学习所有这些,所以这可能是我犯的错误。我正在尝试做一些多继承,就像许多其他人一样。我注意到原型对象看起来很像哈希/字典,我想,为什么不使用像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

1 个答案:

答案 0 :(得分:2)

JavaScript中没有多重继承,因为一个对象只能有一个原型。为了证明它足以看到ECMAScript 5 Object.getPrototypeOf方法当然只返回一个值。对于年龄较大的口译员,您可以尝试__proto__ obj.constructor.prototype的{​​{1}}属性(非标准)。

你所做的例子让你有可能拥有两个不同原型的所有特征,但它会制动原型链 - 这就是为什么instanceof运算符为A和B返回false的原因。事实上A的原型或者B不是你的对象的原型,而是你使用extend函数创建它们的混合。函数名称非常具有误导性(但是这些名称被一些框架和库使用) - 因为我们没有扩展任何对象(在面向对象的编程意义上) - 我们构建了两个对象的混合 - 这是完全不同的设计图案。

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