2013-12-13 5 views
5

मैं पहले से ही js विरासत (this one, this one, this one, आदि)जावास्क्रिप्ट विरासत में सही प्रोटोटाइप प्रभाव क्या है?

पर बहुत सी लेख this article मोज़िला से में पढ़ते हैं, "क्लासिक" विरासत के रूप में दिखाया गया है: (मैं उदाहरण uniformized)

// inherit Base 
function Derived() { ... } 
Derived.prototype = new Base();   <------- 
Derived.prototype.constructor = Derived; <------- 

हालांकि this article में मैं देख रहा हूँ:

// inherit Base 
function Derived() { ... } 
Derived.prototype = Object.create(Base.prototype); <------- 
Derived.prototype.constructor = Derived; 

इसके अलावा मैं भी इस देखा है:

Derived.prototype = Base.prototype; 

और मैं भी प्रयोग किया और constructor दिखावा के उपयोग नहीं पा सके:

Derived.prototype.constructor = Derived; <--- it still work if I skip this line 

अगर मैं इस लाइन को छोड़, new Derived() सही ढंग से Derived() वैसे भी कहते हैं।

तो 1) सही क्या है:

  1. Derived.prototype = new Base();
  2. Derived.prototype = Object.create(Base.prototype);
  3. Derived.prototype = Base.prototype;
  4. अन्य?

और 2) Derived.prototype.constructor = Derived; वास्तव में आवश्यक है? क्यूं कर ?

+1

यह जावास्क्रिप्ट के बारे में बात है, आप जो भी कर सकते हैं वह कर सकते हैं .. मुझे जॉन रेसिग की कक्षा.जेएस पसंद है जो आपके लिए प्रोटोटाइप बकवास लपेटने का तरीका है, ताकि आपको इसे अपने कोड में कभी नहीं देखना पड़े .http: //ejohn.org/blog/simple-javascript-inheritance/ – andygoestohollywood

+1

'Object.create()' अपेक्षाकृत हालिया कमांड है जो पहले मौजूद नहीं था। Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create देखें (ब्राउज़र संगतता अवलोकन उस पृष्ठ के नीचे है)। यदि आप केवल उन ब्राउज़रों का उपयोग करते हैं जिनके पास है, तो इसका उपयोग करें, अन्यथा नहीं - सलाह के हास्यास्पद रूप से स्पष्ट टुकड़े के लिए यह कैसा है? :) –

उत्तर

3
Derived.prototype = new Base(); 

यह सिर्फ प्रोटोटाइप श्रृंखला स्थापित करने के लिए Base निर्माता फोन करता है। कभी-कभी Object.create पर समकक्ष परिणाम देने और देने के दौरान, यह त्रुटि-प्रवण है और इससे बचा जाना चाहिए। What is the reason to use the 'new' keyword at Derived.prototype = new Base पढ़ें (और इसे क्यों उपयोग किया जाना चाहिए)।

Derived.prototype = Object.create(Base.prototype); 

इस कला के राज्य है - Correct javascript inheritance इतना कहने के लिए।

Derived.prototype = Base.prototype; 

This is plain wrongDo not use। यह Base और Derived उदाहरण से ऑब्जेक्ट से प्राप्त होता है - जबकि यह (शायद ही कभी) "कक्षा" के लिए कई रचनाकारों के लिए सहायक हो सकता है, यह "subclassing" नहीं है।

Derived.prototype.constructor = Derived; वास्तव में आवश्यक है? क्यूं कर?

यह लोप जा सकता है और अपनी स्क्रिप्ट फिर भी काम करेंगे, लेकिन सुविधा के लिए आपको लगता है कि (new Derived).constructor === Derived उम्मीद करेंगे। JavaScript inheritance and the constructor property

1

जावास्क्रिप्ट

में शास्त्रीय विरासत क्या करना this जवाब में सही तरीका मैं 1 और 2 दिखा क्यों 2 जावास्क्रिप्ट में शास्त्रीय विरासत का अनुकरण करने के लिए सबसे अच्छा तरीका है के बीच का अंतर समझाया क्या है।

संक्षेप में, समाधान में 1 बच्चे माता-पिता के उदाहरण से प्राप्त होते हैं। समाधान 2 में बच्चों की श्रेणी (Derived.prototype) माता-पिता (बेस.प्रोटोटाइप) की कक्षा से विरासत में होती है। यह माता-पिता पर गंभीर सीमाएं लगाता है, क्योंकि इसे 0 तर्कों के साथ बुलाया जाना चाहिए।

तीसरा समाधान और भी बदतर है क्योंकि व्युत्पन्न और बेस क्लास के प्रोटोटाइप एक ही वस्तु हैं, इसलिए कोई विधि ओवरराइडिंग नहीं हो सकती है। इससे भी बदतर, Derived.prototype में परिभाषित एक विधि सभी बेस उदाहरणों के लिए उपलब्ध होगी और यदि बेस.प्रोटोटाइप पर उसी नाम के साथ एक विधि घोषित की गई है, तो इसे आसानी से बदला जाएगा।

निष्कर्ष: 2 जावास्क्रिप्ट में शास्त्रीय विरासत करने का सही तरीका है।

निर्माता संपत्ति की जरूरत

प्रोटोटाइप पर constructor गुण को सेट की स्थापना यह सभी उदाहरणों लिए सुलभ बना देता है। यह सुविधा के लिए बस है, विरासत हिस्सा इसके बिना काम करता है।

+0

प्रबुद्ध। क्या आप प्रश्न के दूसरे भाग में भी मदद करेंगे? – Offirmo

+0

सहायता की खुशी है। – Tibos

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