JavaScript是否支持像C ++一样的多重继承?

3
我知道如何在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
你的问题中的“像C++一样”的部分是错误的。在JavaScript中,单继承已经在许多方面不像C++一样运作了... - Merlyn Morgan-Graham
1
@Merlyn Morgan-Graham 我只是在提到一个功能。 - lovesh
@Merlyn,你可以在JavaScript中模拟经典继承,所以我猜他希望能够用多重继承做同样的事情。 - Lime
4个回答

7
从技术上讲,JavaScript不支持多重继承。每个对象都有一个明确定义的单个“原型”对象,因此有一个“原型链”。
然而,可以使用附加方法(所谓的“expandos”)来增强任何对象。因此,您可以迭代一组方法并逐个地将它们添加到新创建的对象中。这样的集合称为“mixin”。
例如,几个框架提供了mixin:
- 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!

3

谢谢提供的链接,+1。你说得对,我需要一些时间来用JavaScript的方式思考问题。我曾经在经典继承上卡了很长时间。但是,你为什么认为它比经典继承更好呢? - lovesh
你只需在任何时候为任何对象添加属性和方法,便可以随意添加所需的任何行为,这比 C++ 的方式更加灵活。我认为,JavaScript 的方式更接近程序员真正想要的。如果我有一个对象 X,我想给它增加行为 Y,在 JavaScript 中,我可以随时在任何对象上使用任何组合的行为来实现这一点。而在 C++ 中,所有内容都必须在编译之前预先声明。 - jfriend00


1

你可以让fun2从fun1继承,这样就简单了。

fun2.prototype = new fn1;

如果上述方法对您不起作用,那么很遗憾您无法进行实时多重继承。您可以将属性复制到新对象中,但这并不是真正的“实时”继承。
例如:
func3.prototype = new fun1();
for(var i in func2.prototype)func3.prototype[i]=fun2.prototype[i];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接