2012-11-02 11 views
6

पर कॉल करता है मैं एक जावास्क्रिप्ट प्रोजेक्ट पर काम कर रहा हूं जो प्रोटोटाइपिकल विरासत का उपयोग करता है। जिस तरीके से मैंने इसका उपयोग करने का निर्णय लिया है वह निम्नलिखित है:प्रोटोटाइपिकल विरासत कन्स्ट्रक्टर को दो बार

var MySuperClass = function (param) { 
    this.prop = param; 
}; 
MySuperClass.prototype.myFunc = function() { 
    console.log(this.prop); 
}; 

var MySubClass = function (param) { 
    MySuperClass.call(this, param); 
}; 
MySubClass.prototype = new MySuperClass(); 
MySubClass.prototype.constructor = MySubClass; 

var obj = new MySubClass('value'); 
obj.myFunc(); 

विरासत पर जोर देने के साथ।

इस मुद्दे के साथ समस्या यह है कि यदि मैं प्रत्येक वर्ग (सुपर और उप) के निर्माता में एक console.log डालता हूं, तो सुपर क्लास को दो बार बुलाया जाता है, एक बार जब यह MySubClass.prototype = new MySuperClass(); के साथ सबक्लास में पास हो जाता है पैरामीटर और पैरामीटर के साथ एक बार जब यह उप वर्ग के निर्माता में 'कन्स्ट्रक्टर चोरी' होता है।

अगर मैं उन पैरामीटर को सहेजने का प्रयास करता हूं (जिसका मतलब है कि मुझे रिक्त पैराम से निपटने के लिए तर्क जोड़ना है) तो यह त्रुटियों का कारण बन सकता है।

मैं यह कर अब अगर:

var MySubClass = function (param) { 
    MySuperClass.call(this, param); 
}; 
MySubClass.prototype = MySuperClass; 
MySubClass.prototype.constructor = MySubClass; 

सब कुछ सही ढंग से काम करने लगता है, लेकिन मैं कभी नहीं देखा है किसी को भी पहले ऐसा (मेरी Googl'ing में)।

क्या कोई मुझे बता सकता है कि दूसरा और गलत कैसे है (ऐसा लगता है कि यह क्रॉकफोर्ड विरासत समारोह के समान होता है) और यदि पहले है तो इसे दो बार आग लगाने के लिए कैसे ठीक करें?

MySubClass.prototype = MySuperClass; 

आप प्रोटोटाइप के बजाय प्रोटोटाइप वस्तु के रूप में समारोह स्थापित कर रहे हैं ताकि आप इनहेरिट नहीं कर रहे हैं कि तुम क्या उम्मीद थी:

+0

संभावित 'डुप्लिकेट' का कारण क्या है (यहां नहीं '* नहीं' * 'नया' कीवर्ड का उपयोग करने के लिए?] (Http://stackoverflow.com/questions/12592913/what-is-the-reason-to-use - नया-कीवर्ड-यहां) – Bergi

उत्तर

7

ऐसा करने से एक सही समाधान नहीं है।


लेकिन आप सही हैं। ऐसा करने से कन्स्ट्रक्टर का आह्वान होता है, जो समस्याएं पैदा कर सकता है।

MySubClass.prototype = new MySuperClass(); 

समाधान Object.create उपयोग करने के लिए विरासत स्थापित करने के लिए है। यह आपको एक नई वस्तु देता है जो प्रदान की गई वस्तु से विरासत में मिलता है, लेकिन किसी भी निर्माता को नहीं बुलाता है।

MySubClass.prototype = Object.create(MySuperClass.prototype); 

अब आप एक वस्तु MySubClass.prototype कि MySuperClass.prototype से इनहेरिट करने के लिए सौंपा है, लेकिन आप वास्तव में निर्माता आह्वान करने के लिए नहीं था।


गैर ES5 अनुरूप कार्यान्वयन Object.create का समर्थन नहीं करेंगे, लेकिन आप इसके लिए एक (आंशिक) शिम बना सकते हैं।

if (!Object.create) { 
    Object.create = function(proto) { 
     function F(){} 
     F.prototype = proto; 
     return new F(); 
    }; 
} 

फिर, यह एक पूर्ण शिम नहीं है, लेकिन यह सिर्फ निर्माता का संदर्भ देता है प्रोटोटाइप वस्तु आह्वान करने के लिए बिना विरासत में मिला वस्तुओं बनाने के लिए सक्षम होने के लिए पर्याप्त emulates।

+0

बहुत बहुत धन्यवाद :) – obie

+0

आपका स्वागत है। –

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