そのような例があります。
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`
今、私は同じ方法でバーから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を使用しているため、ピクセルフォルダが表示された画面全体が表示されます)。そしてアラートウィンドウに書き込みますRangeError: undefined
しかし、私はこのシーケンスでアラートコールを持っているので
alert(fooObj.barVal);
alert(barObj.fooVal);
2番目のアラートは、私がそれから待っているものを正確に示しています-それはを示していますBarValue
。
Barで複製するとapply()が機能しないのはなぜですか?どういうわけか、2つの機能の間にそのような種類のゲートを作ることは可能ですか?