2013-04-23 13 views
8

अंदर नियत प्रोटोटाइप मैं इस कोड है:निर्माता

var MyClass = function(b) { 
    this.a = b; 
    this.getA = function() { 
     return that.a; 
    } 
} 

var SecondClass = function(b) { 
    this.prototype = new MyClass(b); 
    this.getB = function() { 
     return 6; 
    } 
} 

var a = new SecondClass(2); 
console.log(a.getA()); 

उत्पादन मुझसे कहता है एक() कोई विधि Geta बुलाया

मैं मान लिया है कि कि this.prototype = नए MyClass कर() के अंदर SecondClass के लिए कन्स्ट्रक्टर इसे MyClass से विधियों को विरासत में ले जाएगा?

मुझे यकीन है कि ऐसा करने के बेहतर तरीके हैं, लेकिन मैं प्रोटोटाइप कीवर्ड के व्यवहार को समझने की कोशिश कर रहा हूं।

+1

"प्रोटोटाइप" एक कीवर्ड नहीं है। – Pointy

+1

'वापसी कि.ए;' '' वापसी 'होना चाहिए।' बीटीडब्ल्यू। –

उत्तर

11

prototypeउदाहरण की नहीं, निर्माता समारोह का एक विशेष गुण है।

जब आप new Func() साथ निर्माता फ़ंक्शन को कॉल करें, इंजन एक नई वस्तु जो Func.prototype से विरासत पैदा करेगा और उसके बाद निर्माता समारोह अंदर this सेट नई वस्तु का उल्लेख करने के।

तो, this.prototype से अलग एक साधारण संपत्ति होने के नाते, असाइनमेंट होने पर विरासत पहले से ही हुई थी।

चूंकि आप MyClass.prototype पर कोई भी विधि निर्दिष्ट नहीं कर रहे हैं, तो आपको यहां प्रोटोटाइप विरासत के साथ कुछ भी करने की ज़रूरत नहीं है।

var SecondClass = function(b) { 
    MyClass.call(this, b); 
    this.getB = function() { 
     return 6; 
    } 
}; 

हालांकि आप add all methods that are shared by instances to the prototype और फिर इसे से SecondClass इनहेरिट के प्रत्येक उदाहरण देना चाहिए,: आपको बस इतना करना है .call[MDN] का उपयोग कर नए बनाए गए उदाहरण के लिए MyClass लागू है।

var MyClass = function(b) { 
    this.a = b; 
} 
MyClass.prototype.getA = function() { 
    return this.a; 
}; 

var SecondClass = function(b) { 
    // call parent constructor (like 'super()' in other languages) 
    MyClass.call(this, b); 
} 
// Setup inheritance - add 'MyClass.prototype' to the prototype chain 
SecondClass.prototype = Object.create(MyClass.prototype); 
SecondClass.prototype.getB = function() { 
    return 6; 
}; 

var a = new SecondClass(2); 
console.log(a.getA()); 

इस will become easier in ES6 के सभी: यह एक पूरा सेटअप की तरह लग सकता है कि कैसे है।

+1

धन्यवाद, इससे चीजों को थोड़ा स्पष्ट बनाने में मदद मिली। बस स्पष्ट करने के लिए, मुझे लगता है कि MyClass.protoype केवल ऑब्जेक्ट का उदाहरण होगा। तो जब मैं MyClass को सामान सौंपता हूं।प्रोटोटाइप यह केवल ऑब्जेक्ट के एक विशिष्ट उदाहरण (जो MyClass के लिए प्रोटोटाइप है) को असाइन करता है, ऑब्जेक्ट "क्लास" नहीं। धन्यवाद – user350325

+0

हाँ, बिल्कुल ... –

3

"प्रोटोटाइप" नामक एक संपत्ति केवल उन वस्तुओं पर दिलचस्प है जो कार्य हैं। आपके कन्स्ट्रक्टर में "प्रोटोटाइप" संपत्ति के मान को असाइन करने से कोई प्रभाव नहीं पड़ता है (इस मामले में); कन्स्ट्रक्टर फ़ंक्शन की "प्रोटोटाइप" संपत्ति क्या मायने रखती है।

SecondClass.prototype = new MyClass(); 

या कुछ। एक कन्स्ट्रक्टर का प्रोटोटाइप ऑब्जेक्ट बनाया गया सभी उदाहरणों के बीच साझा किया जाता है, इसलिए प्रोटोटाइप को कन्स्ट्रक्टर पैरामीटर द्वारा अलग-अलग होने के कारण भी बहुत समझदारी नहीं होती है।

एक और बात आप के अंदर "SecondClass" से "MyClass" निर्माता कॉल करने के लिए किया जाएगा कर सकता है:

function SecondClass(b) { 
    MyClass.call(this, b); 
    this.getB = function() { 
    return 6; 
    }; 
} 

कि this कि new SecondClass() कॉल का निर्माण कर रहा है बनाने का असर पड़ेगा द्वारा सजाया जा "MyClass" कन्स्ट्रक्टर। यह वास्तव में विरासत नहीं होगा, लेकिन आपको "getA" फ़ंक्शन मिलेगा।