2016-07-16 3 views
6

MDNバインドポリフィルを以下に示します。MDNバインドポリフィルの線の説明

私はfToBind.apply呼び出しで

this instanceof fNOP ? this : oThis 

の目的をうまくしようとしています。

私はそれの周りに頭を上げることはできません。誰かが光を放つのを助けることができますか?

Function.prototype.bindMdn = function(oThis) { 
    if (typeof this !== 'function') { 
     // closest thing possible to the ECMAScript 5 
     // internal IsCallable function 
     throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); 
    } 
    var aArgs = Array.prototype.slice.call(arguments, 1) 
     , fToBind = this 
     , fNOP = function() {} 
     , fBound = function() { 
     return fToBind.apply(this instanceof fNOP ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments))); 
    } 
    ; 
    if (this.prototype) { 
     // Function.prototype doesn't have a prototype property 
     fNOP.prototype = this.prototype; 
    } 
    fBound.prototype = new fNOP(); 
    return fBound; 
}; 

バインド機能を呼び出すときにバインドされた機能のインスタンスを対象として提供されている場合、短絡のようですが、typeofのチェックはこれをキャッチしなければならないので、私はその存在を理解していません。 MDNページへ

リンク:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

編集:これは示唆し、重複は異なる問題です。提案された複製はなぜfNOPが必要かを尋ねます。私は完全にそれをgrok。

この質問は、instanceofチェックが必要な理由とその機能について説明しています。上記の短絡仮説とそれが完全に意味をなさない理由を提示する。

+1

MDNページのリンクを追加してもよろしいですか? –

+0

@mortezaT [MDN:Function.prototype.bind()Polyfill](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Polyfill) –

+0

恐らく[ MDN Function.prototype.bindバインドされた関数がコンストラクタとして呼び出されました](http://stackoverflow.com/questions/23693282) –

答えて

4

あなたはnewで新しいインスタンスを作成するために.bindの結果を使用している場合:

function TestClass(a,b,c,d) { 
} 

var TestClassBound = TestClass.bindMdn(null, 1, 2, 3); 

new TestClassBound(); 

その後this instanceof fNOPtrueです。

typeof this !== 'function'は、それが、それが別のオブジェクトのプロトタイプにコピーされなかったことを確認するcallまたはapplyかに機能上の通常の方法と呼ばれていなかったかどうかをテストするためにそこにあります。だから、唯一のtypeof thisは常にfunctionなり機能上のbindのすべての定期的な呼び出しのために

Function.prototype.bind.call("Not a function", 1, 2, 3); 

それとも

var testObj = {}; 
testObj.bind = Function.prototype.bind; 

testObj.bind(1,2,3); 

のようなものを防ぎます。

typeof this !== 'function'は、bindというオブジェクトが実際に呼び出されているかどうかを確認するためのものです。

fBind内のthis instanceof fNOPは、バインディングの結果が正しく使用されていることを確認します。

+0

_ "fBind内のこのインスタンスfNOPは、バインディングの結果が使用されたときの動作が正しいことを保証します。"私が理解しておいては、関数呼び出しに 'new'を前置すると、ハードバインドされた関数はハードバインドされた関数の' this'にバインドされた明白な新しいオブジェクトで呼び出されるので、 'this instanceof fNOP'は''新しいインスタンスのために作成されたプレーンオブジェクト 'fNOP'は条件がfalseを返すことを意味します(' fNOP'のプロトタイプは新しく作成されたオブジェクトのプロトタイプチェーンに存在しません)。間違って – Taurus

+0

'this'は' oThis'にバインドされます。これは 'new'演算子が使用されている場合には当てはまりません.' new'演算子が使用されている場合、' this'は作成された新しいオブジェクトにバインドされる必要があります背後にある「新しい」演算子によって。 – Taurus

+0

また、 'fNOP'は何を表していますか?私は "f"が "関数"のためにそこにあると仮定します、他の3文字についてはどうですか? – Taurus