2012-01-22 14 views
3

私は、次のしているJavaScriptオブジェクト:このとJavascriptでパラメータとしての機能を渡す

function Alfa() { 
    this.status=''; 
    this.setStatus = function(value) { 
    this.status=value 
    } 
} 

function Beta() { 
    this.setSomething = function(setter) { 
    setter('Something'); 
    } 
} 

と実行より:

alf=new Alfa(); 
alf.setStatus('foo'); 

あなたはALFの値に見ればこれは、正常に動作し、 ステータスは 'foo'に設定されていますが、

bet=new Beta(); 
bet.setSomething(a.setStatus); 
私が期待している何

賭けALFのsetStatus機能を実行すると「何か」に、しかし、これは起きていない状態値を設定することです。プロパティステータスがALFためウィンドウないために設定されているように、ALFのsetStatusは、実行が、これはないALFインスタンスではなくウィンドウを指しています。

目的の機能を得るには適切な方法はありますか?

機能が結合していないされているJavaScriptの
$('xxx').click(alf.setStatus) 
+0

少なくとも1つのエラーがあります:a.setStatusをbet.setSomething()に渡しますが、どこに宣言されていますか? –

答えて

4

これは当然のことながら、実装、実際の生活の中で例えば、私は、イベントハンドラにALFのこれらの機能を渡したいので、私はベータ実装を変更することはできませんが簡略化されています。つまり、thisは、その定義方法ではなく呼び出される方法によって決まります。あなたはbet内からメソッドを呼び出しているので、その後、thisあなたは関係なく、関数が呼び出されるか、安定しthisを作成していないバインド機能を、確認する必要があり、この問題を回避するにはbet

です。 Function.bind

alf.setStatus.bind(alf) 

をそれとも、古い通訳でこの機能を提供するいくつかのES5シムがあるアレント場合:あなたはES5互換性のあるJavaScriptインタープリタを使用している場合

あなたが使用することができます。実際には、バインドのためにmdnリファレンスに1つが提供されています。 JQueryには、$.proxyという名前のバージョンがあります。

単純な実装では、関数とスコープを取る関数を使いたいということです。そして、これを使用するのではなく、具体的にそのスコープであなたのメソッドを呼び出します。何かのようなもの。

function bind(func,o) { return function() { func.call(o); } } 
+0

構文は 'fn.bind(context)'であるので、正しいものは 'alf.setStatus.bind(alf)'です –

+0

はい、申し訳ありません。私は電車に乗っていて、これを自分の電話機に入力しようとしています。自動修正はまた私の数回を得た。編集する。 –

+1

+1は '$ .proxy'と言いますが、通常はunderscore.js' _.bind() 'を使用しています。 –

1

JavaScript内の関数には、たとえば次のようなコンテキストが関連付けられていません。 Pythonでバインドされたメソッドそれでは、あなたが行うことができ、このように、文脈でのsetStatus関数を呼び出すことです:

bet.setSomething(function(value) { 
    a.setStatus.call(a, value); 
}); 

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call

+0

"私はベータ版の実装を変更できません" – KrzysDan

+0

さらに、Betaオブジェクトの機能が低下します(アルファオブジェクトのメソッドsetStatusがあることを知る必要があります) ベストプラクティス – KrzysDan

1

変更setter('Something');setter.call(this, 'Something');には仕事になります。

+0

"ベータ版を変更できません" – KrzysDan

1
function Alfa() { 
    this.status=''; 
    this.setStatus = function(value) { 
     this.status=value 
    } 
} 
function Beta() { 
    this.status=''; 
    this.setSomething = function(setter) { 
     setter.call(this,'Something'); 
    } 
} 
関連する問題