2015-03-14 8 views
5

विन्यास गुण हटाने-योग्य होने लगते हैं:यह कॉन्फ़िगर करने योग्य संपत्ति क्यों नहीं हटाई जा सकती है?

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 ऑपरेटर इस तरह परिभाषित किया गया है:

11.4.1 - The delete Operator

उत्पादन UnaryExpression: deleteUnaryExpression के रूप में मूल्यांकन किया जाता है इस प्रकार है:

  • चलो रेफरीयूनरीएक्सप्रेस का मूल्यांकन करने का नतीजा है।
  • [...]
  • तो 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 संपत्ति वर्णनकर्ता की संपत्ति [[कॉन्फ़िगर करने योग्य]] मान पर सेट है।

यह कैसे संभव है, कि कॉन्फ़िगर करने योग्य संपत्ति को हटाया नहीं जा सकता है?

उत्तर

3

प्रभावी रूप से, कॉन्फ़िगर करने योग्य गुण हटाए जा सकते हैं।

लेकिन एक बड़ी समस्या है: जो केवल native objects पर लागू होती है, लेकिन host objects पर लागू नहीं होती है।

रूप 8.6.2 - Object Internal Properties and Methods में बताया गया है,

होस्ट वस्तुओं के रूप में लंबे समय तक यह के अनुरूप विशिष्ट मेजबान वस्तु इस दस्तावेज़ में कहा गया प्रतिबंध है के रूप में किसी भी कार्यान्वयन पर निर्भर व्यवहार के साथ इन आंतरिक गुण समर्थन कर सकते हैं। एक संपत्ति डेटा गुण के रूप में वर्णित किया जाता है तो

और यह या तो समय के साथ विभिन्न मूल्यों वापस आ सकते हैं, तो या दोनों [:

उन लोगों के लिए, [[GetOwnProperty]] अलग ढंग से व्यवहार करना चाहिए [लिखने योग्य]] और [[कॉन्फ़िगर करने योग्य]] गुण सत्य होना चाहिए, भले ही कोई भी परिवर्तन मान को बदलने के लिए अन्य आंतरिक तरीकों के माध्यम से खुलासा न हो।

अपने उदाहरण में, form.elements एक HTMLFormControlsCollection उदाहरण एचटीएमएल कल्पना द्वारा परिभाषित किया गया है, इसलिए यह एक मेजबान वस्तु है।

इसलिए, स्थिति

  • है यह एक कस्टम [[GetOwnProperty]] जो कहता है कि संपत्ति '0' विन्यास योग्य है क्योंकि अपने मूल्य बदल सकते हैं है।
  • इसमें एक कस्टम [[हटाएं]] भी है जो संपत्ति को हटा नहीं देता है, भले ही [[GetOwnProperty]] कहता है कि यह कॉन्फ़िगर करने योग्य है।
संबंधित मुद्दे

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