2016-07-16 10 views
6

में एक लाइन का स्पष्टीकरण एमडीएन बाइंड पॉलीफिल नीचे दिखाया गया है।एमडीएन बाइंड पॉलीफिल

मैं 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

क्या आप कृपया एमडीएन पेज का लिंक जोड़ना चाहते हैं? –

+0

@mortezaT [MDN: Function.prototype.bind() पॉलीफिल] (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

आप एक .bind का परिणाम का उपयोग new साथ एक नया उदाहरण बनाने के लिए हैं:

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

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

new TestClassBound(); 

फिर this instanceof fNOPtrue है।

typeof this !== 'function' अगर यह एक समारोह पर और नहीं एक नियमित रूप से जिस तरह से साथ बुलाया गया था परीक्षण करने के लिए बस नहीं है call या apply या यकीन है कि यह एक और वस्तुओं प्रोटोटाइप को कॉपी नहीं किया गया था बनाने के लिए। तो यह केवल तरह

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

या

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

testObj.bind(1,2,3); 

कुछ को रोकने के एक समारोह पर bind के हर नियमित कॉल typeof this हमेशा function हो जाएगा के लिए।

तो typeof this !== 'function' यह जांचना है कि ऑब्जेक्ट bind कहा जाता है वास्तव में एक फ़ंक्शन है।

और this instanceof fNOPfBind के भीतर यह सुनिश्चित करता है कि बाइंडिंग के परिणाम का उपयोग होने पर व्यवहार सही है।

+0

_ "और यह उदाहरण एफबीआईपी के भीतर एफएनओपी सुनिश्चित करता है कि बाइंडिंग के परिणाम का उपयोग होने पर व्यवहार सही होता है।" _ कौन सा व्यवहार? मेरी समझ यह है कि, जब आप 'नया' के साथ फ़ंक्शन कॉल को प्रीपेड करते हैं, तो हार्ड-बाउंड फ़ंक्शन को सख्त नई ऑब्जेक्ट के साथ हार्ड-बाउंड फ़ंक्शन के 'यह' से बंधेगा, इसलिए 'यह उदाहरण एफएनओपी' जैसा ही है '[सादे ऑब्जेक्ट नए के कारण बनाया गया] उदाहरण के लिए एफएनओपी ', जिसका अर्थ है कि स्थिति झूठी वापसी करेगी (चूंकि' एफएनओपी 'प्रोटोटाइप नव निर्मित ऑब्जेक्ट की प्रोटोटाइप श्रृंखला में मौजूद नहीं है), जिसका अर्थ है' यह 'सेट किया जाएगा ग़लत – Taurus

+0

तो 'यह' 'o' 'से बाध्य होगा, यदि' नया 'ऑपरेटर उपयोग किया जाता है, तो' नया 'ऑपरेटर उपयोग नहीं किया जाता है, तो यह मामला नहीं होना चाहिए,' यह 'बनाई गई नई वस्तु से जुड़ा होना चाहिए 'नए' ऑपरेटर के पीछे के दृश्यों द्वारा। – Taurus

+0

इसके अलावा, 'एफएनओपी' के लिए क्या खड़ा है? मुझे लगता है कि "एफ" "फ़ंक्शन" के लिए है, अन्य तीन अक्षरों के बारे में क्या? – Taurus

संबंधित मुद्दे