प्रोटोटाइप इनहेरिटेंस

दूसरे डेटा टाइप की तरह, कोई ऑब्जेक्ट, पहले से मौजूद Object प्रोटोटाइप से प्रॉपर्टी और तरीके इनहेरिट करता है. इसका मतलब है कि नतीजे पाने वाले ऑब्जेक्ट में, आपकी तय की गई प्रॉपर्टी और प्रोटोटाइप से इनहेरिट की गई तरीकों वाली प्रोटोटाइप प्रॉपर्टी, दोनों शामिल हैं:

let myObject = {
    'booleanValue' : true
};

myObject;
> Object { booleanValue: true }
    booleanValue: true
    [[prototype]]: Object { … }
            __defineGetter__: function __defineGetter__()
            __defineSetter__: function __defineSetter__()
            __lookupGetter__: function __lookupGetter__()
            __lookupSetter__: function __lookupSetter__()
            __proto__: …
                constructor: function Object()
                hasOwnProperty: function hasOwnProperty()
                isPrototypeOf: function isPrototypeOf()
                propertyIsEnumerable: function propertyIsEnumerable()
                toLocaleString: function toLocaleString()
                toString: function toString()
                valueOf: function valueOf()
                <get __proto__()>: function __proto__()
                <set __proto__()>: function __proto__()

प्रोटोटाइप प्रॉपर्टी को, प्रॉपर्टी की कुंजी से सीधे ऐक्सेस करने के लिए नहीं बनाया गया है. जैसा कि आपने पिछले उदाहरण में देखा होगा, यह ब्राउज़र के डेवलपर कंसोल में इस्तेमाल किए गए [[prototype]] या <prototype> नोटेशन और प्रोटोटाइप की प्रॉपर्टी कुंजी के दस्तावेज़ के सोर्स से तय होता है:

// Chrome:
let emptyObject = {};

emptyObject;
> {}
  [[prototype]]: Object
// Firefox:
let emptyObject = {};

emptyObject;
> Object {  }
  <prototype>: Object { … }

सभी सामान्य ब्राउज़र __proto__ को असल में इस्तेमाल होने वाले स्टैंडर्ड के तौर पर इस्तेमाल करते हैं, लेकिन इसे औपचारिक रूप से स्टैंडर्ड नहीं माना जाता है. इसलिए, प्रोडक्शन कोड में इन्हें इस्तेमाल करने से बचना चाहिए.

let emptyObject = {};

emptyObject.__proto__;
> Object { … }
    __defineGetter__: function __defineGetter__()
    __defineSetter__: function __defineSetter__()
    __lookupGetter__: function __lookupGetter__()
    __lookupSetter__: function __lookupSetter__()
    __proto__:
        constructor: function Object()
        hasOwnProperty: function hasOwnProperty()
        isPrototypeOf: function isPrototypeOf()
        propertyIsEnumerable: function propertyIsEnumerable()
        toLocaleString: function toLocaleString()
        toString: function toString()
        valueOf: function valueOf()
        <get __proto__()>: function __proto__()
        <set __proto__()>: function __proto__()

इसके बजाय, पहले से मौजूद Object.getPrototypeOf() और Object.setPrototypeOf() तरीकों का इस्तेमाल करके, किसी ऑब्जेक्ट के [[Prototype]] को सीधे ऐक्सेस और उसमें बदलाव किया जा सकता है:

let myObj = { "value" : 5 };
let protoParent = { "protoValue" : true };

myObj;
Object { value: 5 }
    value: 5
    <prototype>: Object { … }

Object.getPrototypeOf( myObj );
> Object { … }
    __defineGetter__: function __defineGetter__()
    __defineSetter__: function __defineSetter__()
    __lookupGetter__: function __lookupGetter__()
    __lookupSetter__: function __lookupSetter__()
    __proto__:
    constructor: function Object()
    hasOwnProperty: function hasOwnProperty()
    isPrototypeOf: function isPrototypeOf()
    propertyIsEnumerable: function propertyIsEnumerable()
    toLocaleString: function toLocaleString()
    toString: function toString()
    valueOf: function valueOf()
    <get __proto__()>: function __proto__()
    <set __proto__()>: function __proto__()

Object.setPrototypeOf( myObj, protoParent );
> Object { value: 5 }
    value: 5
    <prototype>: Object { protoValue: true }

इनहेरिट की गई प्रॉपर्टी और लेखक की ओर से तय की गई प्रॉपर्टी के बीच अंतर करने के लिए, आम तौर पर बाद वाले प्रॉपर्टी को ऑब्जेक्ट की "अपनी प्रॉपर्टी" कहा जाता है.

अगर बताई गई प्रॉपर्टी, ऑब्जेक्ट की डायरेक्ट प्रॉपर्टी है, तो बिल्ट-इन Object.hasOwn() तरीका true दिखाता है. वहीं, अगर प्रॉपर्टी इनहेरिट की गई है या मौजूद नहीं है, तो false दिखाता है. जब भी हो सके, इनहेरिट किए गए hasOwnProperty() तरीके के बजाय, Object.hasOwn() का इस्तेमाल करें. यह तरीके Object.create() के साथ काम नहीं करता है.

let myObject = {
    'myValue' : 100
};

Object.hasOwn( myObject, 'myValue' );
> true

myObject.__proto__; // The Object prototype inherited by `myObject` is present:
> Object { … }

Object.hasOwn( myObject, '__proto__' ); // The Object prototype inherited by `myObject` is not an "own property:"
> false

जांचें कि आपको कितना समझ आया

आपको __proto__ का इस्तेमाल क्यों नहीं करना चाहिए?

यह स्टैंडर्ड के मुताबिक नहीं है.
यह कई ब्राउज़र पर काम नहीं करता.
इससे आने वाले समय में आपके कोड के रखरखाव करने वाले लोग भ्रम में पड़ जाएंगे.