2012-10-31 13 views
6

मैं ES6 के लिए मसौदा अधिक पढ़ रहा था, और मैं Object.prototype.toString अनुभाग में इस टिप्पणी पर ध्यान:पहुँच [[NativeBrand]]/[[क्लास]] ES6 (ECMAScript 6) में

ऐतिहासिक रूप से, इस समारोह कभी-कभी स्ट्रिंग [[वर्ग]] आंतरिक संपत्ति का मान उपयोग करने के लिए उपयोग किया जाता था जो पिछले में इस विनिर्देश के संस्करणों का उपयोग विभिन्न अंतर्निहित वस्तुओं के लिए नाममात्र प्रकार टैग के रूप में किया गया था। टूस्ट्रिंग की यह परिभाषा की क्षमता को उन विशिष्ट प्रकार के अंतर्निर्मित ऑब्जेक्ट्स के लिए विश्वसनीय परीक्षण के रूप में उपयोग करती है, लेकिन यह अन्य अंतर्निहित या प्रोग्राम परिभाषित वस्तुओं के प्रकार के लिए विश्वसनीय प्रकार परीक्षण तंत्र प्रदान नहीं करती है।

पर this thread पढ़ने से एस-चर्चा करते हैं, यह लग रहा है [[Class]] तरह ES6 मसौदे में [[NativeBrand]] ले रहा है, इतना है कि वे गैर एक्स्टेंसिबल (उन कम से कम Allen Wirfs-Brock's thoughts थे) जा रहा है के रूप में यह निर्दिष्ट कर सकते हैं।

Object.prototype.toString.apply(new WeakMap()); 
=> '[object WeakMap]' 

"WeakMap" ES6 मसौदे में निर्दिष्ट [[NativeBrand]] रों से एक नहीं है:

जिज्ञासु, मैं एक त्वरित (सक्षम प्रयोगात्मक JavaScript के साथ) फ़ायर्फ़ॉक्स और क्रोम में परीक्षण भाग गया। हालांकि, यह परीक्षण दोनों ब्राउज़रों पर "[object WeakMap]" लौटा।

तो मैं उलझन में हूं। मेरे कुछ प्रश्न हैं।


1. क्या क्रोम और फ़ायरफ़ॉक्स सही तरीके से व्यवहार करते हैं?

ड्राफ्ट पढ़ने के एक तरीके से ऐसा लगता है कि उन्हें [object Object] वापस लौटना चाहिए (और यह सब बहुत नया है, इसलिए मैं इन ब्राउज़रों के भविष्य के संस्करणों में इस बदलाव को देखकर आश्चर्यचकित नहीं होगा)। हालांकि, मसौदे के इस खंड के इरादे को समझना मेरे लिए मुश्किल है, खासकर जब "???" के साथ कुछ जगहें हैं।

क्या कोई भी जो अधिक चर्चा कर रहा है, उससे अधिक प्रासंगिक जानकारी है? या कोई भी जो ड्राफ्ट भाषा को बेहतर समझ सकता है?


2. वहाँ Object.prototype.toString के लिए एक विकल्प है?

ऊपर उद्धृत नोट से यह ध्वनि बनाता है जैसे Object.prototype.toString विरासत कारणों से बनाए रखा गया है, जैसे कि अब कुछ नया है जिसका उपयोग किया जाना चाहिए। खासकर नोड का हिस्सा जो "it does not provide a reliable type testing mechanism for other kinds of built-in ... objects" पढ़ता है। क्या इसका मतलब है कि इस विधि के साथ भविष्य के अंतर्निहित परीक्षणों का परीक्षण नहीं किया जा सकता है?

चलिए एक ठोस उदाहरण का उपयोग करते हैं।

अगर मैं एक वस्तु मैं किसी अज्ञात स्रोत से प्राप्त हुआ है सुनिश्चित करना चाहते हैं एक String वस्तु (एक वास्तविक निर्माण String वस्तु, नहीं एक आदिम स्ट्रिंग) है, मैं कर सकता है:

if (Object.prototype.toString.apply(unknownObject) != '[object String]') 
    throw new TypeError('String object expected.'); 

यह मुझे पता है की सुविधा देता है यदि unknownObjectString ऑब्जेक्ट है, इससे कोई फ़र्क नहीं पड़ता कि इसमें किस फ्रेम का निर्माण किया गया था।

मेरा सवाल यह है कि, क्या यह दृष्टिकोण है जिसे मैं ईएस 6 में आगे बढ़ता हूं? या क्या कोई विकल्प है? Object.getNativeBrandOf की तरह कुछ?


3. [[NativeBrand]] बाद से, यह की तरह लगता है वस्तुओं के भविष्य के प्रकार में शामिल नहीं होंगे कि कैसे इन वस्तुओं के लिए एक परीक्षण करेंगे?

क्या यह काम करेगा?

if (Object.prototype.toString.apply(unknownObject) != '[object Symbol]') 
    throw new TypeError('Symbol expected.'); 

... Symbol संभालने निजी नामों के लिए अंतिम नाम है।

क्या मुझे इसका उपयोग करना चाहिए?

if (Object.prototype.toString.apply(unknownObject) != '[object WeakMap]') 
    throw new TypeError('WeakMap expected.'); 

... या कुछ और?


कारण मैं पूछता हूँ मैं वर्तमान कोड है कि मैं जब भी संभव हो एक या दो साल में ES6 के रूप में आसानी से संभव के रूप में संक्रमण के लिए सक्षम होना चाहते हैं लिख रहा हूँ है। यदि Object.prototype.toString के लिए प्रतिस्थापन है, तो मैं इसे केवल इसमें घुमा सकता हूं और वहां से जारी रख सकता हूं। धन्यवाद!


अद्यतन

Benvie के जवाब के लिए खोज और अपने सवालों के जवाब समझने के लिए सही शब्द के साथ मुझे प्रदान की है।

मुझे इस समस्या से संबंधित an email from Allen Wirfs-Brock on es-discuss मिला।

यहाँ मैं क्या मिला, किसी और एक ही सवाल पूछ के लिए है:

1. Chrome और Firefox ठीक से व्यवहार?

हां, नीचे क्यों समझाया गया है।

2. क्या Object.prototype.toString का कोई विकल्प है?

यह अब है, वहाँ संभावनाओं के अर्थ में एक जोड़े को "विकल्प" प्रतिस्थापन के अर्थ में नहीं होगा, लेकिन।

ए।@@toStringTag प्रतीक का उपयोग करना। हालांकि, मेरी समझ यह है कि Object.prototype.toString अभी भी उपयोग किया जाना चाहिए। @@toStringTag उन परिणामों को विस्तारित करने के लिए प्रदान किया जाता है जिन्हें Object.prototype.toString से वापस किया जा सकता है। यदि आपके पास प्रोटोटाइप है तो आप अपना स्वयं का स्ट्रिंग टैग जोड़ना चाहते हैं, तो आप किसी भी स्ट्रिंग पर मान सेट करने के लिए @@toStringTag का उपयोग कर सकते हैं। Object.prototype.toString इस मान को वापस कर देगा, जहां यह मान ईएस 5 बिल्ट-इन्स में से एक है, इस स्थिति में स्ट्रिंग टैग को '~' के साथ प्रीपेड किया जाएगा।

बी।उपयोगकर्ता परिभाषित वस्तुओं पर निजी प्रतीकों का उपयोग करना। मैंने एक ईमेल को उपयोगकर्ता द्वारा परिभाषित ऑब्जेक्ट पर उसी प्रकार की जांच करने का सबसे अच्छा तरीका बताया है। हालांकि, मुझे नहीं लगता कि यह वास्तव में इस मुद्दे को कैसे सुलझता है, क्योंकि मैं समझने में असफल रहा कि यह एक क्रॉस-फ्रेम समाधान कैसे हो सकता है और यह आपको ES6 अंतर्निर्मित के खिलाफ जांचने नहीं देता है।

तो भले ही वहाँ कुछ विकल्प हैं, यह अच्छा एक चेतावनी के साथ, Object.prototype.toString अब और आगे जाने के साथ रहना है:

यह String के रूप में, सुनिश्चित करें कि आप एक ES5 में निर्मित है इस तरह बनाने के लिए काम करेंगे, लेकिन यह सुनिश्चित करने के लिए मूर्ख साबित नहीं होगा कि आपके पास ईएस 6 अंतर्निहित है क्योंकि उन्हें के साथ धोखा दिया जा सकता है। मुझे यकीन नहीं है कि यह क्यों है, और मुझे कुछ याद आ रहा है, या यह बदल सकता है क्योंकि कल्पना विकसित होती है।

3. चूंकि [[NativeBrand]] ऐसा लगता है कि इसमें भविष्य के प्रकार शामिल नहीं होंगे, इन वस्तुओं के लिए कोई परीक्षण कैसे करेगा?

ऊपर उल्लेख किया है, Object.prototype.toString अभी भी ES6 बनाया-इन पर इस्तेमाल किया जा सकता है, लेकिन यह मूर्ख प्रूफ नहीं कर रहा है के रूप में यह @@toStringTag प्रतीक के उपयोग के साथ किसी के द्वारा जाली जा सकता है। हालांकि, शायद मूर्ख-प्रमाण विधि नहीं होनी चाहिए, क्योंकि Object.prototype.toString(weakmap) == '[object WeakMap]' का मतलब यह नहीं है कि weakmap instanceof WeakMap (और यह नहीं होना चाहिए!)। weakmap किसी अन्य फ्रेम से आ सकता था, या यह उपयोगकर्ता द्वारा बनाई गई कमजोर-जैसी वस्तु हो सकती है। एकमात्र चीज जो आप वास्तव में जानते हैं वह यह है कि यह वीकैप के कार्यात्मक रूप से समकक्ष होने की रिपोर्ट करता है।

यह सवाल भीख मांगने कारण है कि आप एक उपयोगकर्ता परिभाषित वस्तु जो कार्यात्मक रूप से एक String या Array (बिना पहले से जुड़ा हुआ "~") के बराबर होने का रिपोर्ट नहीं कर सकते हैं प्रतीत होता है।

+0

उत्तर (~, आदि के बारे में) कि वेब पर मौजूदा पर निर्भर करता है पर मौजूदा कोड है ओप्पोस्ट्रिंग परिणाम मान मौजूदा ईएस 5 बिल्ट-इन्स के लिए स्पूफ-सक्षम नहीं हैं। हम उस गारंटी को बनाए रखना चाहते हैं, लेकिन केवल वस्तुओं/[[वर्ग]] मानों के लिए है कि O.p.toString ES <= 5 में जानता था। –

+0

'~' चरण को संशोधित 32 द्वारा हटा दिया गया था। – Knu

+0

"यह मुझे बताता है कि अज्ञात ऑब्जेक्ट एक स्ट्रिंग ऑब्जेक्ट है चाहे इससे कोई फर्क नहीं पड़ता।" ओपेरा में नहीं – Knu

उत्तर

1

यह वर्तमान में ES6 spec में एक चलती लक्ष्य है। वस्तुओं के मौजूदा सेट के लिए, मौजूदा यांत्रिकी को संगतता सहित विभिन्न कारणों से बनाए रखा जाता है। सबसे हाल ही में ES6 कल्पना में, published October 26th, आप संभावित भविष्य की दिशा

15.4.6.2.4ArrayIterator.prototype के कुछ संकेत मिल सकता है। @@ toStringTag
का प्रारंभिक मूल्य @@ toStringTag प्रॉपर्टी स्ट्रिंग मान "ऐरे इटरेटर" है।

15.14.5.13Map.prototype। @@ toStringTag
@@ toStringTag संपत्ति का प्रारंभिक मूल्य "मानचित्र" स्ट्रिंग मान है। बहुत आखिरी सवाल के लिए

आप मूल चर्चा है कि इस पर in this thread उत्पन्न पा सकते हैं एस-पर चर्चा

+0

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