2015-02-15 9 views
19

मैं एक छोटा सा जावास्क्रिप्ट खेल ढांचे लिख रहा हूँ और अक्सर वस्तुओं का उपयोग 'गुण, जैसेमैं स्थानीय कार्यों में 'इस' कीवर्ड से कैसे छुटकारा पा सकता हूं?

this.depth = this.y; 

लेकिन इन this' तों काफी कष्टप्रद हैं @ _ @। क्या लिखने का कोई तरीका है ...

depth = y; 

... वैश्विक वस्तु को प्रभावित नहीं कर रहा है?

मेरे उदाहरणों दो कारखाने कार्यों के माध्यम से बनाई गई हैं, और वे पूर्वनिर्धारित वैरिएबल की एक सीमित सूची बनाने, इसलिए उन सभी को depth, y, आदि कार्य, .apply() विधि से उदाहरणों के लिए लागू किया जाता है, हालांकि यह सब बदला जा सकता है है।

कारण मुझे this कीवर्ड छोड़ने की आवश्यकता है कि ढांचा केवल मेरे लिए नहीं बल्कि अन्य लोगों के लिए भी बनाया गया है। मुझे ढांचे में this को हटाने की आवश्यकता नहीं है, लेकिन this कीवर्ड इस लाइब्रेरी के आधार पर एप्लिकेशन को कोडिंग करते समय अधिक समय तक उपज करता है। एकमात्र समाधान जो मुझे अब तक पता है वह 'निजी' चर बना रहा है, लेकिन इससे लोगों के लिए कुछ असुविधा होती है जिन्होंने पहले जावास्क्रिप्ट के साथ काम नहीं किया है, और obj1 से obj1 में हेरफेर करने से .apply - और भी नरक के साथ कई गुमनाम कार्य करने का कारण बनता है। इसलिए, जैसा कि मैं देख सकता हूं, जावास्क्रिप्ट में कोई पैनसिया नहीं है।

कंस्ट्रक्टर्स:

/*...*/ 
'Copy' : function (type) { 
    var obj = { 
    'x':0, 
    'y':0, 
    'xprev':0, 
    'yprev':0, 
    /*...*/ 
    }; 
    return obj; 
}, 
'make' : function (type,x,y) { 
    obj = ct.types.Copy(type); 
    obj.x = obj.xprev = obj.xstart = x; 
    obj.y = obj.yprev = obj.ystart = y; 

    /*...*/ 

    ct.stack.push(obj); 
} 
/*...*/ 
+5

एक XY समस्या की तरह लगता है। – elclanrs

+0

मुझे नहीं लगता, आपको वर्तमान ऑब्जेक्ट –

+0

'यह = टी संदर्भित करने के लिए इसका उपयोग करना होगा; t.depth = y' ... लेकिन हाँ, यह 'भाषा का एक हिस्सा है। – serakfalcon

उत्तर

11

आपका प्रश्न किसी भी कोड देखे बिना जवाब देना मुश्किल है, लेकिन सामान्य रूप में है, "आधुनिक" जावास्क्रिप्ट OOP कारखानों और बंद होने के आधार पर कम वर्बोज़ और पुराने "पर डेप जावा की तुलना में अधिक मुहावरेदार है "new और this 'es के साथ शैली।

पुरानी शैली:

function Something() { 
    this.depth = 0; 
} 
Something.prototype.incDepth = function() { 
    this.depth++; 
} 
foo = new Something() 

नई शैली:

function Something() { 
    var depth = 0; 
    return { 
     incDepth: function() { 
     depth++; 
     } 
    } 
} 
foo = Something() 
+14

चेतावनी के साथ कि "नई शैली" कम कुशल है क्योंकि यह प्रत्येक उदाहरण के लिए 'incDepth' की कई प्रतियां बनाता है। यही कारण है कि 'प्रोटोटाइप' और 'यह' एक वास्तविक वर्ग के बिना कोड विरासत के साथ एक अधिक कुशल जावा-जैसी वस्तु रखने के लिए है। – deceze

+5

"नई शैली" आपको प्रोटोटाइप को विस्तारित करने से भी रोकती है (आप कन्स्ट्रक्टर फ़ंक्शन को एक रैपर के साथ बदलकर एक ही चीज़ प्राप्त करने के लिए * कोशिश कर सकते हैं जो परिणाम के लिए एक विधि जोड़ता है, लेकिन यह बहुत अधिक त्रुटि-प्रवण है) या निर्धारण से किसी ऑब्जेक्ट का प्रकार अपनी '.constructor' प्रॉपर्टी की जांच करके होता है, जो "पुरानी शैली" में लिखे गए खराब-दस्तावेज पुस्तकालयों के आस-पास अपना सिर प्राप्त करने का प्रयास करते समय अक्सर उपयोगी होता है। –

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

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