2016-11-21 7 views
6

मेरी क्रोम दुभाषिया से:किसी फ़ंक्शन को किसी संख्या के सदस्य को असाइन करना, यह विफलता क्यों नहीं है?

a = 3; // OK, of course. 
a.f = function() { return 4; }; // OK. To a number? Ok 
a; // Prints 3 
a.f(); // f is not a function. 
a.f; // Undefined 
बेशक

, a एक वस्तु नहीं है, और मैं कुछ है कि एक वस्तु नहीं है के लिए नए सदस्यों असाइन नहीं कर सकते। लेकिन, दुभाषिया a.f असाइनमेंट क्यों निगलता है यदि उसके बाद विधि या सदस्य मौजूद नहीं है?

+0

तो अपने सवाल यह है कि क्यों यह 'वायुसेना पर एक अपवाद फेंक नहीं है = ... 'लाइन? – Bergi

+0

हां, उदाहरण के लिए। या अधिक सामान्य शब्दों में, इसकी अनुमति क्यों है। –

उत्तर

2

आप ECMA 5.1 की 8.7.2 को देखें, तो आप नीचे इस नोट देखेंगे:

उद्देश्य यह है कि चरण 1 में बनाया जा सकता है उपरोक्त विधि के बाहर से पहुंचा नहीं है। एक कार्यान्वयन उस क्षणिक वस्तु के वास्तविक निर्माण से बचने के लिए चुन सकता है। ऐसी स्थितियां जहां इस आंतरिक विधि का उपयोग करने वाली ऐसी वास्तविक संपत्ति असाइनमेंट में प्रभाव प्रभाव हो सकता है जब यह या तो एक्सेसर फ़ंक्शन का आह्वान करता है या फेंकने वाली त्रुटि जांच का उल्लंघन करता है। जब फेंक सही होता है तो कोई भी संपत्ति असाइनमेंट जो क्षणिक ऑब्जेक्ट पर एक नई प्रॉपर्टी बनाता है, एक त्रुटि फेंकता है।

  • संख्या

बनाएँ:

चरण 1 Let O be ToObject(base).

आप 9.9 में ToObject() विधि को देखें, तो आप तालिका में इन दोनों पंक्तियों मिलेगा है एक नई संख्या वस्तु जिसका [[PrimitiveValue]] आंतरिक संपत्ति के मूल्य पर सेट है तर्क। संख्या वस्तुओं के विवरण के लिए 15.7 देखें।

  • वस्तु

परिणाम इनपुट तर्क (कोई रूपांतरण) है।


तो यह जैसे कि जब आप नंबर पर समारोह सेट करने का प्रयास लग रहा है, यह वास्तव में, कारण काम एक पर हो रहा करने के लिए हो रहा है (हालांकि एक NOOP के रूप में), यह सिर्फ काम के बाद unaccessible हो जाता है आंतरिक क्षणिक वस्तु। जब आप इसे नियमित ऑब्जेक्ट पर करते हैं, तो यह वास्तविक ऑब्जेक्ट देता है, इसलिए असाइनमेंट समझ में आता है।

2

वास्तव में यह एक अच्छा कारण नहीं है कि इसे क्यों मना नहीं किया गया था, यह आसानी से हो सकता था अगर भाषा विकसित होने पर इसे लागू किया गया था।

लेकिन यह बिना किसी त्रुटि के लागू क्यों किया गया था? क्योंकि यह अच्छी तरह से दर्पण करता है जब आप एक आदिम पर किसी संपत्ति का उपयोग करते हैं तो यह होता है: यह निश्चित रूप से किसी ऑब्जेक्ट पर डाला जाता है। इससे कोई फ़र्क नहीं पड़ता कि आप असाइनमेंट के लिए या पुनर्प्राप्ति के लिए प्रॉपर्टी संदर्भ का उपयोग करते हैं, इसमें कोई ऑब्जेक्ट शामिल है। असाइनमेंट सामान्य रूप से काम करेगा, भले ही coerced ऑब्जेक्ट तुरंत बाद फेंक दिया जाए।

हम यह भी देख सकते हैं कि जब हम अपने प्रोटोटाइप पर उस वस्तु के लिए एक विरासत एक्सेसर प्रदान करते हैं:

"use strict"; 
 
Object.defineProperty(Number.prototype, "f", { 
 
    set: function(value) { 
 
     console.log(typeof this+" "+this+" got "+value+" assigned to .f"); 
 
    }, 
 
    get: function() { 
 
     console.log(typeof this+" "+this+"'s .f property was accessed"); 
 
     return function() { 
 
      console.log("method called on "+typeof this+" "+this); 
 
     }; 
 
    }, 
 
    configurable: true 
 
}); 
 

 
(3).f = "test value"; 
 
(3).f();

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

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