多重继承问题



我正在摆弄原型链,注意到一些我无法解释的东西。我还在学习这些,所以这可能是我犯的一个错误。我在尝试多重继承,就像其他很多人一样。我注意到原型对象看起来很像哈希/字典,我想,为什么不使用下划线之类的东西。扩展将多个原型对象合并为一个。

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

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

按照建议,我从代码中删除了underscore的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

JavaScript中没有多重继承,因为一个对象只能有一个原型。为了证明这一点,看看ECMAScript 5 Object.getPrototypeOf方法就足够了,当然它只返回一个值。对于较老的解释器,您可以尝试obj.constructor.prototype__proto__属性(非标准)。

你所做的例子给了你一个可能性,从两个不同的原型有所有的功能,然而它刹车的原型链-这就是为什么instanceof操作符返回false为a和B.事实上,a或B的原型不是你的对象的原型,但他们的混合,你已经使用extend函数。函数名是非常容易误导人的(然而这样的名字被一些框架和库使用)——因为我们没有扩展任何对象(在面向对象编程的意义上)——我们构建了两个对象的混合——这是完全不同的设计模式。

跑题了——如果你正在尝试对象和原型继承——尝试使用Object.create方法(ECMAScript 5的)。它在这种情况下非常有用。

最新更新