2015-01-26 9 views
5

में निर्माता के प्रोटोटाइप के लिए तरीके जोड़ Crockford का JavaScript से एक कोड का टुकड़ा है: अच्छा पार्ट्स:उलझाव से निम्न JavaScript

Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

Crockford चला जाता है पर समझाने कि

"द्वारा समारोह बढ़ाने। एक विधि विधि के साथ प्रोटोटाइप, हम अब प्रोटोटाइप प्रॉपर्टी का नाम टाइप करना होगा। यूग्लिनेस का वह बिट अब छुपाया जा सकता है। "

मैं मूल रूप से इस बिंदु को समझने के लिए एक नुकसान पर हूं। इससे पहले हमें क्या करना है कि अब हमें अब नहीं करना है?

+3

आपके पास जो कुछ नहीं है उसके प्रोटोटाइप को छूना एक भयानक विचार है (आप सभी प्रकार के संघर्षों का द्वार खोलते हैं)। यह क्रॉकफोर्ड के हिस्से पर आलसी आलसी आलसी है। – ssube

+1

"सुधार" किया जा रहा है वास्तव में बहुत व्यावहारिक महत्व नहीं है; मुझे लगता है कि यह एक शिक्षण उदाहरण है। – Pointy

+0

@ssube: क्रॉकफोर्ड "बीमार सलाह"? हुंह। यदि यह एक समस्या है, तो हमें हमें बताने के बजाए दिखाएं ... – dandavis

उत्तर

9

वह कह रहा है कि बजाय लेखन की:

MyType.method("method1", function() { 
    ... 
}).method("method2", function() { 
    ... 
}); 
: संभावना (दिए गए return this) डॉट चेन अन्य कॉल के साथ

MyType.method("myMethod", function() { 
    ... 
}); 

:

MyType.prototype.myMethod = function() { 
    .. 
}; 

आप यह लिख सकते हैं

मेह।

2

कोड को तोड़ने:

Function.prototype.method 

जावास्क्रिप्ट में हर वस्तु प्रोटोटाइप अनुमति देता है। यह विरासत का जावास्क्रिप्ट तरीका है। कार्य master object है जिससे अन्य सभी कार्य बनाए जाते हैं। जब आप उस पर एक प्रोटोटाइप सेट करते हैं तो सभी फ़ंक्शन ऑब्जेक्ट्स उस संपत्ति का उत्तराधिकारी होते हैं। इस मामले में फ़ंक्शन method

Function.prototype.method= function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

आप का विस्तार अन्य तरीकों के साथ अपने स्वयं के functions आप टाइप करने की आवश्यकता चाहता था, तो:

somefunction.prototype.name = function(){} 

इस पद्धति के साथ आप कर सकते हैं तो बस इस:

somefunction.method(name, function) 

यह अजीब सा करता है कि:

this.prototype[name] = func; 

यह this कीवर्ड का उपयोग कर फंक्शन ऑब्जेक्ट को संदर्भित करता है। विरासत के लिए प्रोटोटाइप की आय। [name] का उपयोग कर प्रोटोटाइप पर फ़ंक्शन सेट करता है। यह स्ट्रिंग नाम को किसी संपत्ति में परिवर्तित करता है। ऐसा क्यों? क्योंकि:

this.prototype.name 

ठीक से काम नहीं करेगा। यदि आप ऊपर दिए गए कोड का उपयोग करते हैं, तो हर बार एक नया method जोड़ा जाता है, इसे name द्वारा संदर्भित किया जाएगा और आपके द्वारा चुने गए नाम का संदर्भ नहीं दिया जाएगा।

prototype[example] प्रोटोटाइप.एक्स नमूना जैसा ही है। क्योंकि जावास्क्रिप्ट में प्रत्येक प्रॉपर्टी ऑब्जेक्ट पर एक सरलीकृत सूची में संग्रहीत होती है और इसे ऑब्जेक्ट [] का उपयोग करके किसी आइटम से किसी आइटम से कॉल किया जा सकता है।

1

corckford के बयान को साबित करने देता है:

"एक विधि विधि के साथ Function.prototype बढ़ाने के द्वारा, हम कोई longerhave प्रोटोटाइप गुण का नाम कर सकते हैं अब टाइप करने के लिए कुरूपता का यह बिट। छुपाओ। "

यहाँ Crockford आप में हेरफेर कर सकते हैं Function.prototype अपने व्यक्तिगत usage.It लिए कई अलग अलग कार्यक्षमता प्राप्त करने के लिए किसी भी कार्य करने के लिए नया तरीका/संपत्ति जोड़ने के लिए function.prototype को जोड़ा गया कार्यक्षमता है कहना चाहता जावास्क्रिप्ट में कार्यक्षमता फॉर्मेट होती है Function.prototype.lets आपके कोड को तोड़ देती है।

Function.prototype.method = समारोह (नाम, समारोह) {

इस लाइन Function.prototype एक नया method.This विधि जोड़ा जाता है में

दो तर्क प्राप्त करते हैं। name एक नए तरीके के नाम के लिए सैंड्स .और func इसकी कार्यक्षमता के लिए खड़ा है। मुझे लगता है कि आप विधियों और गुणों के बारे में परिचित हैं। कार्य जावास्क्रिप्ट में प्रथम श्रेणी वस्तु है। इसलिए उन्हें रनटाइम के दौरान नई गुण और विधियां जोड़ दी जा सकती हैं।

यह.प्रोटोटाइप [नाम] = func;

यहाँ इस समारोह है जो यह कहता है को दर्शाता है। [name] विधि का नाम है और func विधि की कार्यक्षमता यह तब array notation. का उपयोग कर अंत में

इस वापसी पारित कर समारोह करने के लिए एक नई विधि कहते है;

इस बयान पारित कर समारोह साथ

एक नई पद्धति से जोड़ रहे है के साथ वापस आ गया है।

यहाँ मैं आप के लिए एक व्यावहारिक उदाहरण है:

Function.prototype.method = function (name, func) { 
this.prototype[name] = func; 
return this; 
}; 

function Myfunction(){  // a constructor function called Myfunction 
    this.name='robin';  // it has a name property 
} 

Myfunction.method('mymethod',function(){ console.log(' i am available')}); //adds a method named 'mymethod to Myfunction constructor 

var newObj=new Myfunction();  // creates a new instance of Myfunction class 
console.log(newObj.mymethod()); //calls mymethod() of newObj 

यहाँ myfunction एक constructor.We इस निर्माता के प्रोटोटाइप को विरासत में मिला तरीके जोड़ usind Myfunction.prototype.mymethod=function(){ ..}

आप myfunction के रूप में उपयोग कर सकते हैं है कन्स्ट्रक्टर यह तरीका है कि आप इसे विधि जोड़ते हैं। लेकिन जैसा कि आपने एक नई कार्यक्षमता जोड़ा है फ़ंक्शन।प्रोटोटाइप, तो आप बस इसे पसंद

Myfunction.method('mymethod',function(){console.log('i am available'}); //it will add a method named mymethod to Myfunction's prototype 

यह बयान फोन Myfunction()'s prototypeपरोक्ष करने के लिए एक नई विधि mymethod जोड़ देगी सकते हैं।

ताकि आप आप Myfunction.method('mymethod',function(){ console.log('i am available'});

लिख सकते हैं Myfunction.prototype.mymethod=function(){ console.log('i am available'); .Instead लिखने की आवश्यकता नहीं है तो यह साबित होता है यह Myfunction.prototype बार-बार हर बार जब आप करने के लिए नए तरीकों को जोड़ना चाहते हैं लिखने से आप राहत मिल जाएगी माईफंक्शन कन्स्ट्रक्टर

तो यह क्रॉकफोर्ड का बयान साबित करता है।

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