2012-04-11 17 views
5

मैं इस जावास्क्रिप्ट है:मैं एक कन्स्ट्रक्टर कैसे लपेटूं?

var Type = function(name) { 
    this.name = name; 
}; 

var t = new Type(); 

अब मैं इस जोड़ना चाहते हैं:

var wrap = function(cls) { 
    // ... wrap constructor of Type ... 
    this.extraField = 1; 
}; 

तो मैं कर सकते हैं:

wrap(Type); 
var t = new Type(); 

assertEquals(1, t.extraField); 

[संपादित करें] मैं चाहूँगा एक उदाहरण संपत्ति, एक वर्ग (स्थैतिक/साझा) संपत्ति नहीं।

रैपर फ़ंक्शन में निष्पादित कोड को काम करना चाहिए जैसे कि मैंने इसे वास्तविक निर्माता में चिपकाया था।

Type का प्रकार बदलना नहीं चाहिए।

+1

जो मैं समझता हूं, आप निर्माता को अतिरिक्त संपत्ति जोड़ना चाहते हैं? ताकि आगे के नए उदाहरणों में उस संपत्ति हो? – Joseph

+0

आपको 'wrap' के प्रोटोटाइप को 'रैप()' फ़ंक्शन के अंदर बदलने की आवश्यकता हो सकती है। उदाहरण के लिए: 'var wrap = function (cls) {cls.prototype.extraField = 1; }; '? या अतिरिक्त 'अतिरिक्त' सदस्य के साथ 'टाइप' से विरासत में प्राप्त' टाइप 2 'बनाने के लिए सबसे अच्छा हो सकता है? –

+0

क्या आप अपनी समस्या का अधिक विस्तार से वर्णन कर सकते हैं? – seteh

उत्तर

5

अद्यतन: An updated version here

क्या आप वास्तव में एक और कक्षा में प्रकार का विस्तार किया गया था देख रहे थे। जावास्क्रिप्ट में ऐसा करने के कई तरीके हैं। मैं वास्तव में new के एक प्रशंसक और "वर्ग" के निर्माण के prototype तरीकों (मैं परजीवी विरासत शैली बेहतर पसंद करते हैं) कर रहा हूँ, लेकिन यहाँ मैं क्या मिला है:

//your original class 
var Type = function(name) { 
    this.name = name; 
}; 

//our extend function 
var extend = function(cls) { 

    //which returns a constructor 
    function foo() { 

     //that calls the parent constructor with itself as scope 
     cls.apply(this, arguments) 

     //the additional field 
     this.extraField = 1; 
    } 

    //make the prototype an instance of the old class 
    foo.prototype = Object.create(cls.prototype); 

    return foo; 
}; 

//so lets extend Type into newType 
var newType = extend(Type); 

//create an instance of newType and old Type 
var t = new Type('bar'); 
var n = new newType('foo'); 


console.log(t); 
console.log(t instanceof Type); 
console.log(n); 
console.log(n instanceof newType); 
console.log(n instanceof Type); 
+0

बढ़ाकर आपके कंसोल आउटपुट से, मैं 'कन्स्ट्रक्टर' में संग्रहीत फ़ंक्शन का विस्तार करना चाहता हूं। नया क्षेत्र 'नाम' के बगल में दिखाना चाहिए, न कि 'कन्स्ट्रक्टर' के बगल में। –

+0

तो आप वास्तव में क्या करना चाहते हैं एक और निर्माता बनाओ? या बस मौजूदा में जोड़ें? – Joseph

+0

मैं मौजूदा कन्स्ट्रक्टर का विस्तार करना चाहता हूं। –

0

मैं कैसे करना है पता नहीं है जिस तरह से आपने सुझाव दिया, हालांकि मैं मानता हूं कि मुझे रूचि होगी। मैं केवल टाइप वैरिएबल को एक रैपर फ़ंक्शन में पुन: असाइन करने के बारे में सोच सकता हूं:

var wrap = function(name) 
{ 
    Type.prototype.constructor.call(this, name); 
    this.extraField = 1; 
}; 
wrap.prototype = Type.prototype; 
Type = wrap; 

var t = new Type(); 
assertEquals(1, t.extraField); 
संबंधित मुद्दे