2012-02-11 7 views
0

私はそのような例を持っています。JS OOP。継承とapply()関数です。なぜそれは動作しません?

function Bar() { 
    this.barVal = "BarValue"; 
} 

function Foo() { 
    this.fooVal = "FooValue"; 
    Bar.apply(this, arguments); // here I use apply() to get access everything in Bar from Foo; 
} 
var barObj = new Bar; 
var fooObj = new Foo; 

alert(fooObj.barVal);  // the output is `BarValue` 

これで、BarからFooのすべてに同じ方法でアクセスする必要があります。私は自分のコードを変更します:

function Bar() { 
    this.barVal = "BarValue"; 
    Foo.apply(this, arguments); // I add the same line of code, just change names 
} 

function Foo() { 
    this.fooVal = "FooValue"; 
    Bar.apply(this, arguments); // and also leave it here because I want previous functionality too 
} 
var barObj = new Bar; 
var fooObj = new Foo; 

alert(fooObj.barVal);  
alert(barObj.fooVal);  // there is no any output for both 

しかし出力はありません。実際にはいくつかの間違いが発生します。コメントの下でFoo.apply(this, arguments);を非表示にすると、alert(fooObj.barVal);コールが再び機能します。私はこのようにそれを確認した場合:

function Bar() { 
    this.barVal = "BarValue"; 
    try { 
     Foo.apply(this, arguments); 
    } 
    catch(e) { 
     alert(e); 
    } 
} 

それも(私が表示され、その上にピクセルフォルダを使ってChromeので、全体blaсk画面を使用)、ブラウザの作業を停止します。そして、アラートウィンドウにはRangeError: undefined

を書き込みますが、私はこの順序でアラートのコール

alert(fooObj.barVal);  
alert(barObj.fooVal); 

を持っているように、第2の警告は、私はそれからのを待っている正確に何を示している - それはBarValueを示しています。

なぜ私がバーで複製するとapply()が機能しないのですか?どういうわけか、この種のゲートを2つの機能の間で作ることは可能でしょうか?

+0

再帰が検出されました。 –

答えて

2

applyは、指定したthisを使用して関数を呼び出します。

考えてみてください。 FooBarを呼び出し、BarFooを呼び出した場合、無限再帰で終了します。 「Fooにもう一度お電話をしないでください」と言うには何らかの方法が必要です。または、少なくとも、Fooは「おい、私はすでに一度呼び出されているが、今回は何もしない」を見ることができる必要がある。

真実は、あなたがそのにおいをする必要があるという事実を言わなければなりません。一般的に、そのような循環依存性は望ましくありません。もし2人の人が絡み合って仕事をするためにお互いの機能が必要なのであれば、絡み合ったものを別のタイプに分けてそこからFooBarの両方を使うか、 、 か何か。しかし、私はそれについて何かを具体的に言うために、より多くのデザインを見る必要があります。

関連する問題