私はそのような例を持っています。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つの機能の間で作ることは可能でしょうか?
再帰が検出されました。 –