2017-01-27 14 views
0
//class bar 
//(construtor) 
go(res, err){ 
    //functions that use 'this' 
    console.log(this); 
} 
foo(article){ 
    //do stuff 
    var that = this; 
    var sorting = { 
     sort: function(t){ 
      //do stuff 
      console.log(that); //looks exactly like 'bar' 
      return that; 
     }, 
     go: that.go //ERROR: want this.go, got foo.sorting 
    } 
    return sorting; 
} 

はなぜ'これは渡されたときに' this 'と同じではありません、なぜですか?

new bar.foo('x').sort(); 

作業罰金とショー 'は' & 'はこの' 'バー'、しかし

new bar.foo('x').go(); 
として

がfooの仕事と(私の知る限り)を返していません 'これ' を行います?

方法は

new bar.go(); 

と同じになるように、私のルート

new bar.foo('x').go(); 

のですか?

+0

ローカル変数の代わりに 'this.sorting'を割り当てることはできますか?このようなチェーンをすると、チェーン以外のインスタンスを返すとチェーンが壊れる可能性があります。 – tadman

+0

@tadman 'bar'はソートオプションのタイプが異なる複数の" foo "関数を持っていますので、簡単にするために' bar.fooX.sort() 'は複数の関数の構文です。これは悪い習慣ですか? – Ben

+0

私はいつも物事をエンジニアリングして、「これを返す」が連鎖するように設計されたメソッドの最後にあるようにします。これは、重複した呼び出しが発生している場合には、内部状態を維持することを意味します。私はあなたの一般的な目的がここに何であるか分かりません。 – tadman

答えて

3

thisの値は、thisとなり、sortingオブジェクトにはなりません。

var sorting = { 
    sort: function(t){ 
     console.log(that); 
     return that; 
    }, 
    go: that.go.bind(that) 
} 
+0

これは機能します!ありがとう!あなたは、 'それは'ソート 'に「再定義されている」と言っていますか? – Ben

+0

@Ben 'それはあなたがそれを設定すると決して変更されませんが、' this'は関数が呼び出されるオブジェクトに応じて変更されます( 'bind'しない限り)。 – 4castle

関連する問題