0

そのような例があります。

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つの機能の間にそのような種類のゲートを作ることは可能ですか?

4

1 に答える 1

2

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

ちょっと考えてみてください。とをFoo呼び出すと、無限再帰になります。「二度と電話しないで」と言う何らかの方法が必要です。または、少なくとも、Foo は「ねえ、私はすでに 1 回呼び出されました。今回は何もしないでください」と表示できる必要があります。BarBarFooFoo

しかし、正直なところ、その臭いのいずれかを行う必要があるという事実. 通常、そのような循環依存関係は望ましくありません。2 つのものが非常に絡み合っていて、機能するために互いの機能が必要な場合は、絡み合ったものを別のタイプに分割して、そこから と の両方を使用するか、両方を継承させることができるように思えFooますBar。なにか。しかし、それについて具体的なことを言うには、デザインをもっと見る必要があります。

于 2012-02-11T18:16:25.920 に答える