2010-03-03 7 views
5

में बाल ऑब्जेक्ट्स से पैरेंट ऑब्जेक्ट फ़ंक्शंस को कैसे कॉल करते हैं, इसलिए, मैं जॉन रेसिग के blog पर पढ़ रहा था, अपने micro-templating javascript engine को देखा और प्रोटोटाइप विरासत की मेरी समझ को गहरा बनाने के लिए जावास्क्रिप्ट के लिए अपने स्वयं के टेम्पलेट प्रबंधन सिस्टम को आजमाने और कार्यान्वित करने का निर्णय लिया । हालांकि, जिस मिनट में मैंने इसे लिखना शुरू किया, मैं एक समस्या में भाग गया।आप जावास्क्रिप्ट

function template_manager() { }; 

template_manager.prototype = { 
    tags: {}, 
    templates: {}, 
    output: {}, 
    default_template: "default", 
    set: function (tags, template_name) { 
     template_name = "Greetings!"; 
     //template_name = this._util.template(this.nothing, this.default_template); 
     console.log(template_name); 
    }, 
    get: function(tags, template_name) { 
     console.log("Getting"); 
    }, 
    unset: function(tags, template_name) { 
     console.log("Removing"); 
    }, 
    render: function(template_name) { 
     console.log("Rendering"); 
    }, 
    //_util goes here 
}; 

// Take it for a quick test drive. 
test = new template_manager; 
test.set(); 
test.get(); 
test.unset(); 
test.render(); 

तो मैं कुछ सामान्य कोड पर काम शुरू कर दिया, और मैं इसे एक उपयोगिता वस्तु में डाल करने का फैसला किया:

_util: { 
     // Used to set the default values for optional arguments 
     optional: function(obj, def_value) { 
      return (typeof obj === "nothing") ? obj : def_value; 
     }, 
     template: function(template_name) { 
      return this._util.optional(template_name, this.default_template); 
     }, 
    }, 

और अब

शुरू करने के लिए, यहाँ मेरी आधार कोड है , जब मैं अपने फ़ंक्शन को अपने set() फ़ंक्शन में कॉल करने का प्रयास करता हूं तो मुझे निश्चित रूप से त्रुटि मिलती है क्योंकि thistemplate_manager ऑब्जेक्ट की बजाय _util ऑब्जेक्ट पर इंगित करता है। मैंने jQuery extend विधि पर एक नज़र डाली है, और मुझे लगता है कि मैं समझता हूं कि यह क्या कर रहा है। मेरा सवाल है, क्या मैं को अपने स्वयं के/उपयोग jQuery/extend विधि को लागू करने के लिए की आवश्यकता है, या मेरे _util ऑब्जेक्ट से template_manager ऑब्जेक्ट को कॉल करने का कोई और तरीका है?

(पी एस मैं डगलस Crockford के article प्रोटोटाइप विरासत पर देखा है, और मुझे लगता है कि जवाब नहीं है, लेकिन मुझे डर है मैं पूरी तरह से अभी तक यह समझ में नहीं आता हूँ।)

+0

@ क्रिस, मुझे डबल चेकिंग के लिए सही सेवा प्रदान करता है। इसे पकड़ने के लिए धन्यवाद! –

उत्तर

8

आप उपयोग कर सकते हैं call या apply यानी

template_manager.prototype = { 
    set: function (tags, template_name) { 
     template_name = "Greetings!"; 
     template_name = this._util.optional.call(this, this.nothing, this.default_template); 
     console.log(template_name); 
    } 
} 

अधिक स्पष्ट विवरण के लिए "Getting Out of Binding Situations in JavaScript" लेख देखें।

+0

समाधान काम करता है और लेख अधिक विस्तार से दायरे को समझाते हुए एक उत्कृष्ट काम करता है। बहुत बहुत धन्यवाद Li0liQ! –

+0

@ सेन विएरा, आपका स्वागत है। – Li0liQ

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