2011-07-31 62 views
2

我知道如何在JavaScript中進行繼承,但我只能繼承一個對象。 例如。確實javascript支持多重繼承,比如C++

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

+3

「喜歡C++」 你的問題的一部分是被誤導的。 Javascript中的單繼承在許多方面已經不像C++那樣工作... –

+1

@Merlyn Morgan-Graham我只是指的是一個特性 – lovesh

+0

@Merlyn你可以在JavaScript中模擬古典繼承,所以我猜他希望他能做多重繼承是同樣的事情。 – William

回答

7

從技術上講,JavaScript不提供多重繼承。每個對象都有一個定義明確的單個「原型」對象,因此是一個「原型鏈」。

但是,可以使用附加方法(即所謂的「expandos」)來增強任何對象。所以你可以遍歷一組方法並單獨將它們添加到新創建的對象中。這樣的集合被稱爲「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! 
1

那麼你可以簡單地從FUN2 FUN1開始與繼承。

fun2.prototype = new fn1; 

如果上述不適合你,那麼不幸的是你不能做多重繼承。 您可以將屬性複製到新的對象,但它不是真正的「活」繼承。

例如:

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

的Javascript支持混入這是(在我看來)的方式比C++多重繼承好。人們必須改變C++方式的思維,以欣賞mixin的可用性。你可以閱讀他們:

Fresh Look at Mixins

Wikipedia Mixins

As many references as you want to read

+0

感謝您的鏈接,+ 1.你是對的,它需要我花一些時間來思考的方式。我被困在經典的繼承上了很多時間,但爲什麼你認爲它比古典繼承更好呢? – lovesh

+0

事實上,您只需向任何對象中添加屬性和方法,就可以將任何對象添加到任何對象中,這比只能在編譯時預先確定的C++方式更加靈活。國際海事組織,Javascript的方式更接近程序員真正想要的。我有一個對象X,我想給它的行爲Y.在Javascript中,我可以隨時使用任何具有任何行爲組合的對象在運行時執行此操作。在C++中,所有東西都必須在編譯之前預先聲明。 – jfriend00