1

これを「ただの好奇心」または「それは可能ですか?」の下にファイルします。

たとえば、私が持っているとしましょう...

home: function(options) {
   this._home('home', options)
}

login: function(options) {
    this._home('login', options)
}

homelogin追跡目的で、多数のオブジェクト プロパティの識別子であることは明らかです。オブジェクトプロパティ内で変数を使用せずに返す方法はありますhomelogin(外部関数呼び出しは問題ありません)?

更新:これは不可能であることが判明しました。受け入れられた回答は質問に正確に答えるものではありませんが、同じプロパティへの多数の呼び出しを単純化する素晴らしい例です。

4

2 に答える 2

3

プロパティが参照する関数内で、ハードコーディングせずにそのプロパティ名からhome何らかの方法で文字列を取得できるようにしたいという意味であれば"home"、私の知る限り、それは不可能です。

あなたが達成しようとしていることを推測するだけで、次のようなものが少なくとも少しは役立ちます:

function callHome(propName) {
   return function(options) {
      this._home(propName, options);
   }
}

var someObj = {
   home: callHome('home'),
   login: callHome('login')
}
someObj.home({some:"option"});

少なくとも、プロパティごとに同じ関数本体を繰り返す必要はありません。デモ: http://jsfiddle.net/EeEAw/

注:_home()質問で呼び出されたが定義されていない関数は、実際のコードのどこかで定義されていると思います。フィドルでダミーを作成しましたが、回答には表示されません。

余談ですが、関数は実際にはオブジェクトやプロパティに「属している」わけではないことに注意してください。この種のことを行うのを止めるものは何もありません。

var obj = {
   test : "test",
   home : function() {
      alert(this.test);
   }
};
var funcRef = obj.home;
var obj2 = {
   method1 : funcRef
}
obj.home = null;
funcRef();
obj2.method1();

つまり、同じ関数への複数の参照を作成でき、元のobj.homeプロパティが他の値に設定されていても (追加の参照が存在し続ける限り)、関数は存在し続けます。

于 2012-08-01T05:38:56.393 に答える
1

識別子の解決とオブジェクト プロパティのルックアップは、完全に別のメソッドを使用します。withを使用してスコープ チェーンの先頭にオブジェクトを追加できますが、厳密モードでは完全に失敗する可能性があります。

あなたが持っている場合:

var obj = {test:'test'};
alert(test);

次に、識別子テストがスコープ チェーンで解決されます。そこには存在しないため、エラーがスローされます。ただし、次の場合:

alert(obj.test);

次に、最初にobjが解決され、オブジェクトへの参照として検出されます。次に、識別子testがオブジェクトのプロパティとして解決されます。以下でも使用できます

with (obj) {
  alert(test);
} 

この場合、objは一時的にスコープ チェーンの先頭に配置されるため、最初にtestが解決されます。

于 2012-08-01T05:55:25.200 に答える