2012-11-14 3 views
6

मैंने अभी सीखा है कि मैं जावास्क्रिप्ट क्लास में can overwrite a method दिखाता हूं, जैसा कि नीचे दिखाया गया है, लेकिन वास्तविक कन्स्ट्रक्टर के बारे में क्या है?क्या मैं जावास्क्रिप्ट में एक कन्स्ट्रक्टर को ओवरराइट कर सकता हूं?

यदि संभव हो, तो कक्षा को तत्काल किए बिना मैं इसे कैसे कर सकता हूं?

var UserModel = (function() { 
    var User; 
    User = function() {}; // <- I want to overwrite this whilst keeping below methods 
    User.prototype.isValid = function() {}; 
    return User; 
})(); 

उत्तर

9

बस अस्थायी रूप से prototype वस्तु बचाने के लिए, और उसके बाद निर्माता समारोह की जगह:

var proto = UserModel.prototype; 
UserModel = function() { /* new implementation */ }; 
UserModel.prototype = proto; 
+0

इतना साफ है कि! धन्यवाद! – Industrial

+0

ध्यान दें कि यदि आपके पास दायरे तक पहुंच नहीं है तो आप एक कन्स्ट्रक्टर को ओवरराइट करने में सक्षम नहीं होंगे .. उपयोग केस क्या है? –

+0

@ Maelnison मुझे लगता है कि ओपी बाद में निर्माता को ओवरराइट करना चाहता है। –

0

मूल रूप से, आप एक अस्थायी समारोह जो कुछ नहीं करता है बनाते हैं, आप सेट अपने प्रोटोटाइप माता पिता वर्ग के प्रोटोटाइप है , तो आप बेस क्लास को अपने कन्स्ट्रक्टर को कॉल किए बिना माता-पिता के रूप में उपयोग कर सकते हैं।

यदि आपको बाल कक्षा के निर्माता से अपने मूल वर्ग के निर्माता का संदर्भ देने की आवश्यकता है, तो आपको कन्स्ट्रक्टर कॉल को आगे बढ़ाने के लिए Function.prototype.apply का उपयोग करना होगा।

जावास्क्रिप्ट विरासत मॉडल:

// Base class 

var Base = function () { 
    this.foo = 40; 
}; 

Base.prototype.bar = function () { 
    return this.foo; 
}; 

// Inherited class 

var Child = function () { 
    Base.apply(this, arguments); 
    this.foo += 2; 
}; 

var F = function () { }; 
F.prototype = Base.prototype; 
Child.prototype = new F(); 
+0

आप Child.prototype = new F() क्यों करते हैं; और चाइल्ड.प्रोटोटाइप = बेस.प्रोटोटाइप नहीं; ? – Naor

+0

@Naor क्योंकि अगर आप प्रोटोटाइप को पैरेंट के प्रोटोटाइप के रूप में सेट करते हैं, तो यदि आप बच्चे के प्रोटोटाइप में नए तरीके जोड़ते हैं, तो उन्हें माता-पिता में भी जोड़ा जाएगा। और यदि आप बच्चे प्रोटोटाइप में पैरेंट विधियों को ओवरराइट करते हैं, तो उन्हें माता-पिता में भी बदल दिया जाएगा (क्योंकि वे एक ही ऑब्जेक्ट हैं)। 'नया' का उपयोग करने का बिंदु यह है कि यह एक नया उदाहरण अलग करेगा जिसे मूल प्रोटोटाइप को म्यूट किए बिना संपादित किया जा सकता है। –

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

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