एक जेएस __proto__ "मज़ेदार" तथ्य

Nov 26 2022
यदि आपने मुझे काफी लंबे समय तक फॉलो किया है, तो आप पहले से ही जानते हैं कि मैं हमेशा __proto__ के खिलाफ कितना हूं और अभी तक, चूंकि यह बहुत समय पहले ECMAScript मानक के लिए बना था, फिर भी दुर्लभ अवसर हैं, मुझे कम से कम इसका उपयोग किसी वस्तु को ब्रांड करने के लिए मिलता है। स्वीकार्य: प्रदर्शन को एक तरफ रखकर, और कृपया ध्यान दें कि मैं जंगली में __proto__ के उपयोग का सुझाव नहीं दे रहा हूं, यह पोस्ट अन्य कारणों से मौजूद है। वस्तु।
अनस्प्लैश पर मार्क विलियम्स द्वारा फोटो

__proto__यदि आपने मुझे लंबे समय तक फॉलो किया है, तो आप पहले से ही जानते हैं कि मैं हमेशा से कितना खिलाफ रहा हूं और अभी तक, चूंकि इसने इसे ECMAScript मानक के लिए बहुत समय पहले बनाया था, फिर भी दुर्लभ अवसर हैं, मुझे कम से कम इसका उपयोग किसी वस्तु को ब्रांड करने के लिए स्वीकार्य लगता है। :

const factory = (fields, {prototype} = Object) => ({
  __proto__: prototype,
  ...fields
});

// mimic an <a /> reference
factory({href: '/'}, HTMLAnchorElement);

फ़ायरफ़ॉक्स में, __proto__ नए वर्ग से बेहतर स्कोर करता है

प्रदर्शन को एक तरफ रखकर, और कृपया ध्यान दें कि मैं __proto__जंगली में बिल्कुल उपयोग का सुझाव नहीं दे रहा हूं, यह पोस्ट अन्य कारणों से मौजूद है।

ऑब्जेक्ट.प्रोटोटाइप.__प्रोटो__

मुझे पूरा यकीन है कि हर कोई जानता है कि __proto__ एक्सेसर क्या करता है , इसलिए मैं आपको एक चुनौती देना चाहता हूं ... और हां, यह सभी वैध जेएस है:

class Test {}
const __proto__ = Test.prototype;

// what do these operations return?
({__proto__} instanceof Test);
({__proto__: __proto__} instanceof Test);
({"__proto__": __proto__} instanceof Test);
({["__proto__"]: __proto__} instanceof Test);

// what do these operations return?
({__proto__}.__proto__ === Test.prototype);
({__proto__: __proto__}.__proto__ === Test.prototype);
({"__proto__": __proto__}.__proto__ === Test.prototype);
({["__proto__"]: __proto__}.__proto__ === Test.prototype);

यदि आपने उत्तर जानने के लिए स्वयं इन स्निपेट्स को नहीं चलाया है, तो मैं इसमें आपकी सहायता कर सकता हूँ! पहली चुनौती में, आउटपुट false, true, trueऔर falseफिर से होगा, और कारण यह है कि दोनों {__proto__}और {["__proto__"]}को अपनी संपत्ति के रूप में परिभाषित किया गया है , जबकि सिंटैक्स के माध्यम से असाइनमेंट, विशेष सिंटैक्स सुविधाओं का उपयोग किए बिना, यहां तक ​​​​कि चारों ओर उद्धरण के साथ, वास्तव में एक्सेसर के माध्यम से गुजरता है Object.prototype.__proto__

दूसरी ओर, दूसरी चुनौती में (सभी true) यह वास्तव में मायने नहीं रखता है कि हम __proto__सीधे या as तक पहुँचते हैं ["__proto__"], ताकि मूल रूप से शून्य समरूपता हो जिस तरह से हम __proto__सेटर को ट्रिगर कर सकते हैं, जिस तरह से हम __proto__एक बार गेट्टर को ट्रिगर कर सकते हैं यह या तो खुद की संपत्ति है या जादू की विरासत का द्वार है।

... और न केवल __proto__

मैंने खुद की जाँच नहीं की है, लेकिन मेरा मानना ​​है कि हर विरासत __xxx__विशेष एक्सेसर एक ही __proto__अभिशाप से ग्रस्त है, इसलिए कृपया अपने वास्तविक इरादे और अपेक्षाओं के साथ गुणों को असाइन करने के लिए नवीनतम कूल जेएस सिंटैक्स को मिलाकर सावधान रहें, क्योंकि यदि आप कोशिश करते हैं तो चीजें आसानी से केले जा सकती हैं इन गुणों को असाइन करने में होशियार रहें ।

और वह सब लोग हैं!

इस पोस्ट से केवल दूर ले जाने की संभावना इस प्रकार है:

  • यदि आप आज या कल इस बारे में आश्चर्यचकित होने से बचना चाहते हैं कि ये नए सिंटैक्स के साथ कैसे व्यवहार करते हैं, तो भाषा के पुराने-अभी तक काम कर रहे हिस्सों का उपयोग न करें
  • Object.setPrototypeOfजब भी किसी वस्तु के प्रोटोटाइप को मैन्युअल रूप से सेट करना आवश्यक हो, तो स्पष्ट (और दुर्भाग्य से धीमी) पसंद करें, लेकिन जब भी संभव हो, हर दूसरे मामले में कक्षाओं का उपयोग करें
  • इस पोस्ट को अपनी याददाश्त से मिटा दें या इसे एक छोटे वाक्य में सिकोड़ें जैसे: " मुझे अपने कोड में कभी भी उपयोग नहीं करना चाहिए " और फैंसी नई चीजें सीखने के साथ आगे बढ़ें जो आपके मस्तिष्क या भावनाओं के साथ खिलवाड़ न करें__proto__