2015-11-24 7 views
6

मुझे पता है कि आप Object.getOwnPropertyDescriptor(obj,"prop"); के साथ एक निश्चित वस्तु obj की एक निश्चित संपत्ति 'prop' की एक संपत्ति डिस्क्रिप्टर ऑब्जेक्ट प्राप्त कर सकते हैं। मैं बस सोच रहा था: इन वस्तुओं को कहां संग्रहीत किया जाता है? क्या वे आंतरिक रूप से किसी ऑब्जेक्ट में संग्रहीत हैं या .... कहीं और? मैंने उन्हें डेवलपर टूल में खोजने की कोशिश की लेकिन बिना किसी किस्मत के।संपत्ति डिस्क्रिप्टर ऑब्जेक्ट्स कहां संग्रहीत हैं?

+2

की मेरी पढ़ने से कल्पना, इस समारोह को कॉल करें [यहां समाप्त करें] (http://www.ecma-international.org/ecma-262/6.0/#sec-ordinarygetownproperty), जहां यह अलग-अलग 'के समूह से वापसी का निर्माण करता है [ [आंतरिक गुण]] '। उन गुणों को अंतिम रनटाइम के संपर्क में आने के लिए _have_ नहीं है, लेकिन कुछ कार्यान्वयन उन्हें उपलब्ध करा सकते हैं, उदाहरण के लिए देव उपकरण में। आपका मिलेज भिन्न हो सकता है ... –

+1

जहां भी कोई विशेष कार्यान्वयन उन्हें स्टोर करने के लिए चुनता है, वे संग्रहीत होते हैं, या अधिक संभावना है, जब वे पूछे जाते हैं तो उनका निर्माण किया जाता है। –

उत्तर

1

संपत्ति डिस्क्रिप्टर ऑब्जेक्ट्स स्पष्ट रूप से अनुरोध किए जाने तक मौजूद नहीं हैं। जब आप call Object.getOwnPropertyDescriptor पर विज्ञापन-प्रसार बनाए जाते हैं। तो निम्नलिखित कोड:

var foo = {bar:'foo'} 
Object.getOwnPropertyDescriptor(foo, 'bar') === Object.getOwnPropertyDescriptor(foo, 'bar'); 

हमेशा झूठे का मूल्यांकन करें।

तो जैसा कि हम देखते हैं (कोड और विनिर्देश दोनों), संपत्ति वर्णनकर्ता वस्तुओं को संग्रहीत नहीं किया जाता है, लेकिन मांग पर बनाया जाता है।

तो जहां writable, configurable, value, get, set ... atributtes जमा हो जाती है? विशिष्टता के लिए उन्हें उपयोगकर्ता कोड के संपर्क में आने की आवश्यकता नहीं है ... Here is C++ definition for V8 PropertyDescriptor class - ऐसा लगता है कि प्रत्येक संपत्ति एक बाइट पर कब्जा करती है।

और आप जाँच करना चाहते हैं यदि संपत्ति, लिखने योग्य विन्यास या इसी तरह की है, फायरफॉक्स सांत्वना आप ऐसा करने के लिए अनुमति देते हैं (पर केवल यदि संपत्ति लिखने योग्य नहीं है या गेटर/सेटर है): Firefox DevTools

+0

लेकिन * कोई ऑब्जेक्ट * नहीं - जब किसी अन्य ऑब्जेक्ट की तुलना में - झूठी वापसी? उदाहरण के लिए '[1,2,3] == [1,2,3]' भी 'false' – Danield

+1

ऑब्जेक्ट्स की तुलना संदर्भ से की जाती है (" यह ** वही ** ऑब्जेक्ट ") है, मूल्य से नहीं (" यह है ** समान ** वस्तु ")। उदाहरण के लिए। 'var a = {}, बी = ए; एक === ख; // सच' – Ginden

+0

हाँ, आप सही हैं :) – Danield

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