2011-07-31 9 views
2

私はjavascriptで継承を行う方法を知っていますが、私は1つのオブジェクトしか継承できません。例えば、 。今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() { 
... 
... 
}; 
} 

iはfun3オブジェクトが、私はこの

fun3.prototype=new fun1(); 

を行うことができますか私はどのように継承することができ、この

fun3.prototype=new fun2(); 

を行うことができますが、fun2オブジェクトを継承するfun1オブジェクトを継承させたい場合fun1fun2?ここで

+3

"C++のような" あなたの質問の一部は見当違いです。 Javascriptの単一継承は、C++のように多くの点ですでに機能していません。 –

+1

@Merlyn Morgan-Graham私はちょうど機能を指していました – lovesh

+0

@Merlyn JavaScriptで古典的な継承をエミュレートすることができますので、複数の継承を持つ同じもの。 – William

答えて

7

技術的には、JavaScriptが多重継承を提供していません。各オブジェクトは明確に定義された単一の「プロトタイプ」オブジェクトを持ち、したがって「プロトタイプチェーン」を持ちます。

しかし、追加のメソッド、いわゆる "expandos"でオブジェクトを拡張することは可能です。したがって、メソッドのコレクションを繰り返し、新しく作成されたオブジェクトに個別に追加することができます。そのようなコレクションは「mixin」と呼ばれます。

いくつかのフレームワークには、例えば、ミックスインを提供します。

  • qooxdoo
  • ExtJSの
  • MooToolsの
  • ...

彼らはすべてほとんど同じ仕事します。

ただし、ミックスインの変更はオブジェクトに反映されないため、これは実際の継承ではありません。例えば

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

さてあなたは、単にで開始するFUN1から継承fun2持つことができます。

fun2.prototype = new fn1; 

上記のあなたのために動作しない場合は、残念ながらあなたはライブ多重継承を行うことはできません。 プロパティを新しいObjectにコピーすることはできますが、実際には継承を '生きている'わけではありません。例については

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

Javascriptが(私の意見では)C++の多重継承よりもずっといいですミックスインをサポートしています。ミックスインの有用性を理解するために、C++の考え方を変えなければなりません。あなたはそれらについて読むことができます:

Fresh Look at Mixins

Wikipedia Mixins

As many references as you want to read

+0

リンクのおかげで、+ 1.あなたは私にジャバスクリプトの方法で考える時間がかかります。私は多くの時間古典的な継承に立ち往生していました。しかし、なぜそれが古典的な継承よりも良いと思いますか? – lovesh

+0

任意のオブジェクトにいつでもプロパティとメソッドを追加するだけで、任意のオブジェクトに任意の動作を追加するだけで、コンパイル時に事前に決めなければならないC++の方法よりも柔軟性があります。 IMO、Javascriptの方法は、プログラマが本当に望むものに近いです。私はオブジェクトXを持っていて、それにYという振る舞いをしたいのです.Javascriptでは、実行時に振る舞いの組み合わせを持つオブジェクトを使っていつでも実行できます。 C++では、コンパイル時にすべてを事前宣言する必要があります。 – jfriend00