एक जेएस __proto__ "मज़ेदार" तथ्य
__proto__
यदि आपने मुझे लंबे समय तक फॉलो किया है, तो आप पहले से ही जानते हैं कि मैं हमेशा से कितना खिलाफ रहा हूं और अभी तक, चूंकि इसने इसे ECMAScript मानक के लिए बहुत समय पहले बनाया था, फिर भी दुर्लभ अवसर हैं, मुझे कम से कम इसका उपयोग किसी वस्तु को ब्रांड करने के लिए स्वीकार्य लगता है। :
const factory = (fields, {prototype} = Object) => ({
__proto__: prototype,
...fields
});
// mimic an <a /> reference
factory({href: '/'}, HTMLAnchorElement);
प्रदर्शन को एक तरफ रखकर, और कृपया ध्यान दें कि मैं __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__