2015-12-16 4 views
5

के लिए स्पष्टीकरण की आवश्यकता है, जबकि अभी भी "आप जेएस नहीं जानते" पढ़ने के लिए संघर्ष कर रहे हैं, मुझे अच्छा विचार (इस श्रृंखला से प्यार करना) शुरू हो रहा है। मुझे लगता है कि मुझे प्रोटोटाइप का लटका मिल गया है लेकिन मैं नीचे कोड में भाग गया।प्रोटोटाइप/ऑब्जेक्ट स्टेटमेंट और चेन ट्रैवर्सल

var myObject = { 
    a:2 
    }; 

    Object.getOwnPropertyDescriptor(myObject, "a"); 

और जब मैं पूरी तरह से समझ उत्पादन और उसके अर्थ, मैं प्रोटोटाइप की मेरी समझ (या उसके अभाव) का उपयोग करने की कोशिश कर रहा था और नीचे करना चाहता था।

myObject.getOwnPropertyDescriptor 

मैंने सोचा कि यह के प्रोटोटाइप वस्तु और उस विधि प्राप्त करने के लिए आद्य श्रृंखला को पार होगा, लेकिन के रूप में यह पता चला है, वस्तु के प्रोटोटाइप इस जरूरत नहीं है (यह मान वस्तु के प्रोटोटाइप का हिस्सा मैं के रूप में नहीं है डॉक्टर को देख रहा हूं, कम से कम मैं इसे प्रोटोटाइप के हिस्से के रूप में नहीं देखता हूं और यह कहता है कि यह एक विधि है)। तो ऑब्जेक्ट.प्रोटोटाइप.getOwnPropertyDescriptor होने के बजाय, मुझे लगता है कि यह सिर्फ Object.getOwnPropertyDescriptor है।

क्या मैं इसे सही ढंग से समझ रहा हूं और ऑब्जेक्ट की विधि सभी प्रोटोटाइप पर क्यों नहीं है?

+0

हम आपको यह बताने में सक्षम नहीं होंगे कि क्यों एक डिज़ाइन निर्णय लिया गया था, जब तक कि हम में से कोई भी उस समिति पर नहीं था जिसने भाषा तैयार की थी। हम केवल अटकलें कर सकते हैं, जो स्टैक ओवरफ़्लो के लिए उपयुक्त नहीं है। लेकिन, जैसा कि मौजूदा उत्तर दिखाते हैं, हम आपको बता सकते हैं कि आप सही ढंग से समझ रहे हैं। –

उत्तर

2

इस वस्तु के प्रोटोटाइप का हिस्सा नहीं है ... यह एक तरीका है

आप बिल्कुल सही कर रहे हैं है। यह तुरंत एक js कंसोल में सत्यापित किया जा सकता:

> Object.getOwnPropertyDescriptor 
getOwnPropertyDescriptor() { [native code] } 
> Object.prototype.getOwnPropertyDescriptor 
undefined 

एक और अधिक सख्ती से OOP भाषा में, आप getOwnPropertyDescriptor एक स्थिर विधि कॉल कर सकते हैं। अधिक ठीक से, यह प्रोटोटाइप श्रृंखला का हिस्सा नहीं है।

+0

क्या यह सिर्फ डिजाइन समस्या है? जावास्क्रिप्ट लोगों ने प्रोटोटाइप के तहत सब कुछ क्यों नहीं रखा जब वे ऑब्जेक्ट को पहली जगह डिजाइन कर रहे थे ?? – user3502374

+0

"जावास्क्रिप्ट लोगों ने एक्स क्यों नहीं किया?" एक जटिल सवाल है, ज्यादातर तथ्य यह है कि ब्रेन्डन ईच ने कुछ दिनों में जावास्क्रिप्ट बनाया था। लेकिन, इस बिंदु पर, आप सब कुछ प्रोटोटाइप के तहत नहीं रखना चाहते हैं क्योंकि भाषा में प्रत्येक ऑब्जेक्ट के हिस्से के रूप में दी गई विधि उपयोगी या अर्थपूर्ण रूप से सार्थक नहीं हो सकती है। – Chris

+0

धन्यवाद और उत्तर स्वीकृत। हालांकि, मुझे बस कहना है, जिस तरह से चीजें प्रोटो चेन के अनुसार दिखती हैं, मेरी नव निर्मित वस्तु ऑब्जेक्ट के प्रोटोटाइप को पहले ऑब्जेक्ट पर नहीं देखेगी, इसलिए मुझे लगा कि मैं सब कुछ प्रोटोटाइप के नीचे रखता। – user3502374

1

वास्तव में Object.getOwnPropertyDescriptor(myObject, "a")myObject.GetOwnProperty("a") पर कॉल करता है लेकिन यह एक आंतरिक विधि है। source

हम केवल अटकलें कर सकते हैं कारण है कि यह इस तरह से बनाया गया था, लेकिन मुझे लगता है यह समझ में आता है उन्हें Object.prototype के माध्यम से दाय बनाने के बजाय Object वस्तु के तरीकों के रूप में इन उपयोगिता कार्यों को परिभाषित करने के लिए।

एक और स्पष्ट उदाहरण Object.keys विधि होगी। अगर यह Object.prototype.keys था तो हर बार जब हम var inMyPocket = { keys : true } बनाना चाहते थे तो इससे परेशानी होगी। तो अब ऑब्जेक्ट की keys विश्वसनीय रूप से सूचीबद्ध करने के लिए हमें Object.prototype.keys.call(inMyPocket) का उपयोग करने की आवश्यकता होगी, क्योंकि हम यह सुनिश्चित नहीं कर पाएंगे कि inMyPocket.keys() प्रोटोटाइप विधि को संदर्भित करता है या फिर से परिभाषित किया गया था।

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