2015-01-01 2 views
21

ECMAScript 6 में Symbol.toPrimitive, एक नया Symbol.toPrimitive प्रतीक शुरू की है, जो, जब एक वस्तु कुंजी के रूप में इस्तेमाल किया, should define एक समारोह आदिम मूल्य एक वस्तु के वापस जाने के लिए:बनाम Object.prototype.valueOf

let object = { 
    aNumber: 0, 
    [Symbol.toPrimitive]() { 
     return this.aNumber; 
    } 
}; 

object.aNumber = 5; 
console.log(object + 2) // 7 

हालांकि, वहाँ भी Object.prototype.valueOf समारोह है, जो, according to the documentation, आदिम मूल्य के लिए एक वस्तु कन्वर्ट करने के लिए नए सिरे से परिभाषित किया जा सकता है:

let object = { 
    aNumber: 0, 
    valueOf() { 
     return this.aNumber; 
    } 
}; 

object.aNumber = 5; 
console.log(object + 2) // 7 

तो, इन तरीकों में से जो ऑब्जेक्ट को अपने आदिम मूल्य में बदलने के लिए ईएस 6 में एक नई वस्तु को परिभाषित करते समय उपयोग किया जाना चाहिए?

+1

[स्पेक] (http://people.mozilla.org/~jorendorff/es6-draft.html#sec-toprimitive) -> _ अमूर्त ऑपरेशन ToPrimitive इनपुट इनपुट और वैकल्पिक तर्क लेता है पसंदीदा टाइप। अमूर्त ऑपरेशन ToPrimitive अपने इनपुट तर्क को गैर-ऑब्जेक्ट प्रकार में परिवर्तित करता है। यदि कोई ऑब्जेक्ट एक से अधिक आदिम प्रकार में परिवर्तित करने में सक्षम है, तो यह उस प्रकार के पक्ष में वैकल्पिक संकेत प्रीफेरर्ड टाइप का उपयोग कर सकता है ._ - यदि कोई कस्टम '.toprrimitive()' revalult '.valueOf()' का रिटर्न नहीं है – Andreas

+0

@Andreas आपके द्वारा लिंक किया गया अनुच्छेद 'प्रतीक' विनिर्देश से संबंधित नहीं है, लेकिन _any_ गैर-आदिम मान को आदिम में परिवर्तित करने के लिए है। 'Symbol.toPrimitive' के अनुसार नमूना [अनुच्छेद 1 9 .4.3.4।] (Https://people.mozilla.org/~jorendorff/es6-draft.html#[email protected]@toprimitive) –

उत्तर

10

Symbol.toPrimitive का मुख्य उद्देश्य उस क्रम को बदलना है जिसमें toString और valueOf को विभिन्न जबरन परिदृश्यों में बुलाया जाता है।

इस का एक उदाहरण Date देशी वस्तु है, जहां यह डिफ़ॉल्ट रूप से एक नंबर के बजाय एक स्ट्रिंग के लिए मूल्य में परिवर्तित कर देगी:

console.log(1 + new Date()); // "1Mon Aug 15 2016 13:25:31 GMT-0500 (EST)" 

var a = new Date(1000); 
console.log(a == 1000); // false 
console.log(a == a.toString()); // true 

यदि आप ऐसा करने का इरादा नहीं है, तो आप सिर्फ चाहिए जो व्यवहार आप चाहते हैं उससे मेल खाने के लिए obj.valueOf और obj.toString दोनों को ओवरराइड करें - यह मूल वस्तुएं जावास्क्रिप्ट में सबसे अधिक होती हैं।

ध्यान दें कि दोनों valueOfऔरtoString, अधिरोहित किया जाना चाहिए के रूप में ToPrimitive सार आपरेशन कारण ToPrimitive बुलाया जा रहा है के आधार पर बलात्कार के लिए उनमें से या तो कह सकते हैं।

+1

'प्रतीक' अब सभी आधुनिक ब्राउज़रों (सैन्स आईई 11) में समर्थित है, और' Symbol.toPrimitive' [वर्तमान में क्रोम, फ़ायरफ़ॉक्स और नोड द्वारा समर्थित है] (http://kangax.github.io/compat-table/es6/ # test-अच्छी तरह से known_symbols_Symbol.toPrimitive)। – rvighne

+1

@rvighne अनुस्मारक के लिए धन्यवाद, मैंने जवाब अपडेट किया है। –

+0

इसके अलावा 'Symbol.toPrimitive' को एक तर्क के साथ बुलाया जाता है जो इंगित करता है कि किस प्रकार इसे परिवर्तित किया जाना चाहिए (" डिफ़ॉल्ट "।" संख्या "या" स्ट्रिंग ") – jcubic

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