2010-02-09 18 views
10

का उपयोग किए बिना प्रोटोटाइप के आधार पर ऑब्जेक्ट्स बनाना संभव है?जावास्क्रिप्ट: नए + कन्स्ट्रक्टर

मेरी सोच: प्रोटोटाइप अनिवार्य रूप से कन्स्ट्रक्टर फ़ंक्शन (चाहे मूल कन्स्ट्रक्टर जैसे फंक्शन, स्ट्रिंग या ऑब्जेक्ट, या अपने स्वयं के कस्टम कन्स्ट्रक्टर) के गुण हैं और केवल 'नया' कीवर्ड कन्स्ट्रक्टर और इसके प्रोटोटाइप का लाभ उठाने में सक्षम है ऑब्जेक्ट सृजन

क्या मुझे कुछ याद आ रही है?

उत्तर

12

आप ठीक कह रहे हैं, लेकिन अब ECMAScript 5 वें संस्करण में, Object.create विधि एक प्रोटोटाइप के रूप में एक और वस्तुओं का उपयोग कर वस्तु उदाहरण बना करने में सक्षम है:

var proto = {foo: 1}; 
var obj = Object.create(proto); 

उपरोक्त उदाहरण में, obj और बनाया जाएगा यह [[Prototype]] आंतरिक संपत्ति में proto के लिए एक संदर्भ में शामिल होंगे, और:

obj.foo; // 1 
obj.hasOwnProperty('foo'); // false 

इस विधि दिसंबर 2009 को मंजूरी दे दी है नए विनिर्देश से है, जहाँ तक मैं अब देखा है Ava है Mozilla JavaScript 1.9.3 कार्यान्वयन पर ilable।

if (typeof Object.create !== 'function') { 
    Object.create = function (o) { 
    function F() {} 
    F.prototype = o; 
    return new F(); 
    }; 
} 
+1

Cornford एक बार "पैदा" का एक थोड़ा और अधिक कुशल संस्करण प्रस्तावित (Btw, मूल रूप से लासे नीलसन द्वारा उल्लेख किया है, नहीं:

अभी के लिए आपको लगता है कि विधि का व्यवहार इस से, के रूप में Douglas Crockford द्वारा प्रस्तावित की नकल कर सकते हैं क्रॉकफोर्ड), जहां "डमी" फ़ंक्शन (आपके उदाहरण में 'एफ') बंद होने पर संग्रहीत किया जाता है और फिर इसका पुन: उपयोग किया जाता है। यह एक और स्मृति (और रनटाइम) कुशल कार्यान्वयन के लिए बनाता है। यह भी ध्यान रखें कि क्रॉकफ़ोर्ड का 'ऑब्जेक्ट.क्रेट' इम्यूलेशन शायद ईएस 5 के अनुरूप नहीं है (दूसरे तर्क के लिए कोई समर्थन नहीं, TypeError को फेंकने के लिए पहले तर्क की कोई प्रकार की जांच नहीं है यदि यह कोई वस्तु नहीं है, आदि)। देखभाल के साथ नियोजित;) – kangax

+0

आप एक जीवन बचतकर्ता हैं। मैं सचमुच पूरे दिन इस विचार के लिए वेब को खराब कर रहा हूं। –

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