2016-12-31 2 views
0

私はコンストラクタとクロージャを持っています。'this'のコンテキストを変更せずにJavascriptで 'バインド'するにはどうすればいいですか?

私のコンストラクタ関数:

var Item = function(data) { 
    this.sayThis = function() { 
    console.log(this); 
    }; 
    this.data = data; 
}; 

私の閉鎖機能:

var $item = function(document, window, ..., itemData) { 
    return new Item(itemData); 
}.bind(dontWannaPutAnythingHere, document, window, .../*except itemData*/); 

i 'はthisArg' で何かを使用している場合は、新たに形成されたオブジェクト内のthisのコンテキストがどのような傾向にありますこれまでに与えられたものです。私はそれを望んでいませんが、私はそれらの文書、ウィンドウ、ものをバインドしたいので、別の時に最後の引数項目データを提供することができます。

私はつもりだが

// Calling it normally. 
var someItem = $item("chocolate"); 
// This should result in Item {data: "chocolate", ...} 
// and not anything else. 
var someItem = $item("chocolate").sayThis(); 

乾杯、 Rjの

+0

あなたが探している用語は「部分的なアプリケーション」です。 – Bergi

+0

実際に 'bind'を呼び出す関数は' return new Item(itemData);のみを実行し、 'this'はまったく使用しないので、thisArgumentに渡すものとは無関係です。ちょうど 'ヌル 'を使用してください。 – Bergi

+0

ありがとうbergi。はい、私はオブジェクトのようなjQueryを作成するためにこのクロージャーを使用するつもりです。それは独立した環境にある変数を持つことができます。 -cheers、Rj –

答えて

1

として新しい関数を呼び出すこれは動作するようです:

var Item = function(data) { 
    this.sayThis = function() { 
    console.log(this); 
    }; 
    this.data = data; 
}; 

var $item = function(document, window, itemData) { 
    return new Item(itemData); 
}.bind(null, document, window); 

// Calling it normally. 
var someItem = $item("chocolate"); 
// This should result in Item {data: "chocolate", ...} 
// and not anything else. 
var someItem = $item("chocolate").sayThis(); 

それはあなたの要件を満たしていますか?

JSFIDDLE:あなたのコード内であなた'use strict'モードならばhttps://jsfiddle.net/sfcakq2j/4/

+0

うん、そんなに小さいことには大変ごめんなさい。ありがとう、looot! Sebも。素晴らしい一日と新年を迎えてください。 TC –

+0

デフォルトのヌル値であるため、 'undefined'を使用していました。さらに、 'sayThis'(および他のメソッド)は、最後のステートメントのようにメソッドが連鎖できるように、明白な戻り値がないときには最後のステートメントとして' return this'を持たなければなりません。 – Sylwester

+0

は、 '' use strict''を実行するとうまくいきません。これは 'null'になります – Thomas

-1

bind(null, ...)は動作しません。 bindの代わりにを使用してみませんか?

var $item = (function(document, window){ 
    return itemData => new Item(itemData); 
})(document, window); 
+0

もちろん、nullにバインドすると動作しますが、どうしてでしょうか?そして、IEFEが '束縛 'とは非常に異なる何かをしていることに気付く。 – Bergi

+0

#Thomas後でIIFEを使用しなかった場合、後で引数を渡すことはできますか?私は個人的にそれが不可能だと思う。 IIFEは単に実行するので、それは私には役に立たない。私は '厳密'モードについて何も知らない。私は厳密なモードでそれを試して確認します - 歓声、Rj –

関連する問題