وراثت نمونه اولیه

مانند سایر انواع داده ها ، یک شی خواص و متدها را از یک نمونه اولیه 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__()

درعوض، می‌توانید مستقیماً به [[Prototype]] یک شی با استفاده از متدهای Object.getPrototypeOf() و Object.setPrototypeOf() داخلی دسترسی داشته باشید و آن را تغییر دهید:

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 اگر ویژگی ارثی باشد یا وجود نداشته باشد. در صورت امکان، از Object.hasOwn() به جای متد hasOwnProperty() به ارث برده شده استفاده کنید، که از 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__ اجتناب کنید؟

استاندارد نیست
توسط بسیاری از مرورگرها پشتیبانی نمی شود.
نگهبانان آینده کد شما را گیج می کند.