javascript是否支持C ++等多重继承

时间:2011-07-31 05:58:06

标签: javascript multiple-inheritance

我知道如何在javascript中继承,但我只能继承一个对象。 例如

function fun1() {
this.var1=10;
this.meth1=function() {
...
...
};
}

function fun2() {
this.var2=20;
this.meth2=function() {
...
...
};
}

function fun3() {
this.var3=30;
this.meth3=function() {
...
...
};
}

现在,如果我想要一个fun3对象继承fun1对象,我可以这样做

fun3.prototype=new fun1();

或继承fun2对象我可以做到这一点

fun3.prototype=new fun2();

但我如何继承fun1fun2

4 个答案:

答案 0 :(得分:7)

从技术上讲,JavaScript不提供多重继承。每个对象都有一个明确定义的单个“原型”对象,因而是一个“原型链”。

但是,可以使用其他方法扩充任何对象,即所谓的“expandos”。因此,您可以迭代一组方法,并将它们单独添加到新创建的对象中。这样的集合被称为“mixin”。

有几个框架提供mixins,例如:

  • 的Qooxdoo
  • ExtJS的
  • mootools的
  • ...

它们的工作方式基本相同。

但请注意,这不是真正的继承,因为对mixin的更改不会反映在对象中。

例如:

var mixin = {
    method: function () {
        console.log('Hello world!');
    }
};
var foo = new fun1();
foo.method = mixin.method;
foo.method(); // Hello world!
mixin.method = function () { console.log('I changed!') };
foo.method(); // Hello world!

答案 1 :(得分:3)

Javascript支持mixins(在我看来)比C ++多继承更好。人们必须改变C ++方式的思路,以了解mixin的有用性。你可以阅读它们:

Fresh Look at Mixins

Wikipedia Mixins

As many references as you want to read

答案 2 :(得分:1)

答案 3 :(得分:1)

嗯,你可以简单地从fun1继承fun2开始。

fun2.prototype = new fn1;

如果以上内容对您不起作用,那么很遗憾您无法进行多重继承。 您可以将属性复制到新对象,但它不是真正的“实时”继承。

例如:

func3.prototype = new fun1();
for(var i in func2.prototype)func3.prototype[i]=fun2.prototype[i];