विन्यास गुण हटाने-योग्य होने लगते हैं:यह कॉन्फ़िगर करने योग्य संपत्ति क्यों नहीं हटाई जा सकती है?
var o = {};
Object.defineProperty(o, 'prop', {
configurable: true,
value: 'val'
});
delete o.prop; // true
o.prop; // undefined
लेकिन यह निम्न मामले में काम नहीं करता है, कम से कम फ़ायरफ़ॉक्स और क्रोम पर:
var form = document.createElement('form'),
input = document.createElement('input');
form.appendChild(input);
var elems = form.elements;
Object.getOwnPropertyDescriptor(form, 0)
.configurable; // true <────────────────────── !!!
delete elems[0]; // false │
elems[0]; // input │
(function(){ 'use strict'; // V
delete elems[0]; // TypeError: property 0 is non-configurable
})(); // and can't be deleted
लेकिन इस कल्पना खंडन करने के लिए लगता है।
delete
ऑपरेटर इस तरह परिभाषित किया गया है:
उत्पादन UnaryExpression:
delete
UnaryExpression के रूप में मूल्यांकन किया जाता है इस प्रकार है:
- चलो रेफरीयूनरीएक्सप्रेस का मूल्यांकन करने का नतीजा है।
- [...]
- तो IsPropertyReference (रेफरी) सच, तो
- बुला का परिणाम है वापसी [[हटाएं]] आंतरिक पद्धति पर ToObject (GetBase (रेफरी)) तर्कों के रूप GetReferencedName (रेफरी) और IsStrictReference (रेफरी) प्रदान करते हैं।
तो delete
का उपयोग करने का परिणाम [[हटाएं]] पर निर्भर करता है। आइए अब क्या देखते हैं [[हटाएं]] करता है:
8.12.7 - [[Delete]] (P, Throw)
जब [[हटाएं]] हे के आंतरिक विधि के साथ संपत्ति नाम पी और बूलियन ध्वज फेंक कहा जाता है, निम्नलिखित कदम उठाए जाते हैं:
- desc बुला [[GetOw का नतीजा हो चलो nProperty]] O की आंतरिक विधि संपत्ति नाम पी के साथ आंतरिक विधि।
- तो descअपरिभाषित है, तो सच लौट आते हैं।
- यदि desc।[[विन्यास]] से हे नाम पी साथ अपनी संपत्ति निकालें सच, तो
- है।
- वापसी सच।
- वरना अगर फेंक, तो एक लेखन त्रुटि अपवाद फेंक देते हैं।
- रिटर्न झूठी।
इसलिए, यदि संपत्ति विन्यास योग्य है, वह हटाने-योग्य होना चाहिए।
लेकिन रुकिए, शायद Object.getOwnPropertyDescritor
एक ट्रोल है और कहता है कि एक संपत्ति विन्यास योग्य है, लेकिन [[विन्यास]] झूठी है। चलो देखते हैं:
15.2.3.3 - Object.getOwnPropertyDescriptor (O, P)
जब getOwnPropertyDescriptor समारोह कहा जाता है, निम्नलिखित कदम उठाए जाते हैं:
- तो Type (हे) वस्तु नहीं है एक लेखन त्रुटि फेंक अपवाद।
- नामToString (पी) होने दें।
- desc साथ तर्क नामहे की [[GetOwnProperty]] आंतरिक विधि बुला का नतीजा हो करते हैं।
- FromPropertyDescriptor (desc) को कॉल करने का परिणाम लौटाएं।
तो यह भी, [[GetOwnProperty]] का उपयोग करता है जैसे [[हटाएं]]। शायद ट्रोल से प्रॉपर्टी डिस्क्रिप्टर है?
8.10.4 FromPropertyDescriptor (Desc)
सार आपरेशन FromPropertyDescriptor संपत्ति वर्णनकर्ता वर्णन साथ कहा जाता है जब, निम्नलिखित कदम उठाए जाते हैं:
- तो वर्णनअपरिभाषित है, तो वापसी अपरिभाषित।
- obj के रूप में अगर अभिव्यक्ति नई वस्तु द्वारा एक नई वस्तु बनाने का नतीजा हो चलो() जहां वस्तु मानक में निर्मित है कि नाम के साथ निर्माता है।
- ...
- कॉल [[DefineOwnProperty]] obj तर्कों के साथ "
configurable
" के आंतरिक विधि, Property Descriptor {[[मान]]:। वर्णन [[विन्यास]], [[लिखने योग्य ]]: सच, [[Enumerable]]: सच, [[विन्यास]]: सच}, और झूठी।- वापसी obj।
तो नहीं, यह न तो ट्रोल नहीं है। configurable
संपत्ति वर्णनकर्ता की संपत्ति [[कॉन्फ़िगर करने योग्य]] मान पर सेट है।
यह कैसे संभव है, कि कॉन्फ़िगर करने योग्य संपत्ति को हटाया नहीं जा सकता है?