0

わかりました、これは何日も私を混乱させてきました! 次のようなものがあるとしましょう:

var FooBar = function(args) {
   this.annoy = typeof args == "boolean" ? args : false;
   this.Foo();
}

FooBar.prototype.Foo = function() {
   if (this.annoy)
      window.alert("My name is Foo!")
   else
      window.console.log("My name is Foo!")
   this.Bar()
}

FooBar.prototype.Bar = function() {
   if (this.annoy)
      window.alert("My name is Bar!")
   else
      window.console.log("My name is Bar!")
}

これはうまくいきます。しかし、 が のプロパティである別のオブジェクトのプロパティとして定義されている場合、Bar()newに引数として渡すことなくアクセスする方法はありますか? 例えば:FooBarprototypeannoyBar()annoy

FooBar.prototype.evenDeeper = {
   Bar: function() {
      // I wish to access "annoy" here!
   },

   anotherOne: function() {
   },

   yetAnotherOne: 'value'
}

私は間違っているかもしれませんが、内部Foo()の ,Bar()は と呼ばれるthis.evenDeeper.Bar()はずですよね? さらに、Bar()再帰的にしたい場合はどうしますか? 自分自身を自分自身の内部Bar()と呼ぶだけですか、またはまたはまたは何と呼びますか?Bar()Foobar.evenDeeper.Bar()this.Bar()

概要

  1. 内部にある場合、どのようにBar()アクセスできますか?annoyevenDeeper
  2. Bar()自分自身の中で自分自身をどのように参照しますか?

免責事項:私は、sで誰かを困らせるつもりはありませんalert()!;)

4

1 に答える 1

1

1. A) 変数を evenDeeper.Bar に渡します。B) 「this」を使用して FooBar プロトタイプにアクセスするには、evenDeeper.bar.apply(new FooBar(args)) を使用します。C) FooBar.annoy 変数に evenDeeper.annoy を割り当てます (ブール値は値で渡され、変更が反映されないため、お勧めしません)

2. A) evenDeeper.Bar() 内から this.Bar() を使用し、「this」変数を変更していない限り、それ自体を参照する必要があります。B) this.Bar をコールバックとして this.Bar() に渡し、その中で実行します C) 関数コンテキストで this.Bar() を宣言して、それ自体を単に Bar() として参照できるようにします。例を次に示します。

FooBar.prototype.evenDeeper = (function () {
    function Bar() {
        if (this.annoy) {
            alert('are you annoyed yet?');
        }
        Bar.apply(this);
    }
    return {
        Bar: Bar,
        anotherOne: function () {},
        yetAnotherOne: function () {}
    };
}());

var test = new FooBar(true);
// WARNING: this will never finish!
test.evenDeeper.Bar.apply(test);

これは一般的な解決策です。より具体的なものを投稿した場合、目的を達成するためのより良い方法が見つかる可能性があります。個人的には、ある名前空間以外の名前空間に依存する関数を作成することは避けたいと思います。

于 2013-08-10T14:15:09.453 に答える