2011-08-07 20 views
12

क्या जावास्क्रिप्ट ऑब्जेक्ट का उदाहरण प्राप्त करने का कोई विश्वसनीय तरीका है?जावास्क्रिप्ट टाइप/इंस्टेंस नाम

उदाहरण के लिए, नकली 'obj.getInstance()' फ़ंक्शन पर निर्भर है।

var T = { 
    Q: { 
     W: { 
      C: function() {} 
     } 
    } 
}; 

var x = new T.Q.W.C(); 
console.log(x.getInstance() === T.Q.W.C); // should output true 

यदि यह ईसीएमए विनिर्देश का हिस्सा नहीं है, तो कृपया उत्तर में ब्राउज़र/node.js समर्थन और संगतता शामिल करें।

+1

मुझे लगता है कि आप सवाल अलग तरीके से व्यक्त किया है। 'x' * * एक उदाहरण है और हां, 'नया' का उपयोग करना एक उदाहरण प्राप्त करने के लिए बहुत विश्वसनीय है। उदाहरण के प्रकार को पाने के लिए शायद आप 'instancof' की तलाश में हैं? https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/instanceof –

उत्तर

19

instantiating कार्य करने के लिए एक सूचक प्राप्त करने के लिए (जो एक "वर्ग" नहीं है, लेकिन प्रकार है), obj.constructor जहां obj किसी भी वस्तु का उपयोग करें।


जावास्क्रिप्ट में कोई कक्षा नहीं है। इस प्रकार, जावास्क्रिप्ट में कोई कक्षा के उदाहरण नहीं हैं। केवल वस्तुएं हैं। वस्तुओं को अन्य वस्तुओं (उनके तथाकथित प्रोटोटाइप) से प्राप्त होता है। आप अपने कोड में क्या कर रहे हैं सचमुच किसी ऑब्जेक्ट टी को परिभाषित कर रहा है, जो विशेषता क्यू एक और ऑब्जेक्ट है, जो विशेषता डब्ल्यू एक अन्य ऑब्जेक्ट है, जिसका विशेषता सी एक फ़ंक्शन है।

जब आप "टी.क्यू.डब्ल्यूसी का नया उदाहरण बना रहे हैं", तो आप वास्तव में केवल कन्स्ट्रक्टर के रूप में कार्य T.Q.W.C को कॉल कर रहे हैं। एक कन्स्ट्रक्टर के रूप में बुलाया जाने वाला एक फ़ंक्शन एक नई ऑब्जेक्ट लौटाएगा जिस पर कन्स्ट्रक्टर फ़ंक्शन को कॉल किया गया था (thisconstructorFunction.apply(newObject, arguments); जैसे नए ऑब्जेक्ट को मधुमक्खी कर रहा है)। उस लौटे ऑब्जेक्ट में एक छिपी हुई संपत्ति constructor होगी जो ऑब्जेक्ट बनाने के लिए कन्स्ट्रक्टर के रूप में बुलाए गए फ़ंक्शन को इंगित करेगी। इसके अतिरिक्त एक भाषा सुविधा है जो आपको परीक्षण करने की अनुमति देती है कि किसी दिए गए फ़ंक्शन को instanceof ऑपरेटर का उपयोग करके ऑब्जेक्ट के लिए कन्स्ट्रक्टर फ़ंक्शन के रूप में उपयोग किया गया था।

तो आप निम्न कर सकता है:

console.log(x instanceof T.Q.W.C); 

या

console.log(x.constructor === T.Q.W.C); 
+1

मुझे आशा है कि आपको संपादन पर ध्यान नहीं दिया जाएगा। –

+0

अगला उत्तर पूछा गया प्रश्न का उत्तर दें। – ekerner

4

मैं इस के साथ कुछ परेशानी थी, समाधान था:

String(x.constructor) === String(T.Q.W.C) 
12

केवल क्रोम पर परीक्षण किया:

function FooBar() { 

} 

var foobar = new FooBar(); 

console.log(foobar.constructor.name); // Prints 'FooBar' 
4

मामले किसी में अभी भी 2017 में इस पढ़ रही है:

obj.constructor उपयोग के बारे में सावधान रहें, क्योंकि यह एक अपरिवर्तनीय संपत्ति नहीं है।

instanceof ऑपरेटर आम तौर पर अधिक विश्वसनीय है। तुम भी Object.getPrototypeOf(obj) उपयोग कर सकते हैं:

var arr = []; 
arr instanceof Array; // true 
Object.getPrototypeOf(arr); // Array [ ] 
Object.getPrototypeOf(arr) === Array.prototype; // true 

विषय पर इस उपयोगी दस्तावेज़ देखें:

https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch5.md

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