Prototip devri

Diğer veri türlerinde olduğu gibi nesne, yerleşik bir Object prototipinden özellikleri ve yöntemleri devralır. Bu da sonuçta ortaya çıkan nesnenin hem tanımladığınız özellikleri hem de prototipten devralınan yöntemleri içeren prototip özelliği:

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__()

Prototip özelliklerine, doğrudan özellik anahtarı tarafından erişilmesi amaçlanmamıştır. Farklı Önceki örnekte bunun [[prototype]] veya <prototype> gösteriminin kullanılması geliştirici konsollarını ve içeriklerini belgeleri:

// Chrome:
let emptyObject = {};

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

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

Yaygın olarak kullanılan tüm tarayıcılarda __proto__ fiili standart olarak kullanılsa da bu ve üretim kodunda bu kullanmaktan kaçınılmalıdır.

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__()

Bunun yerine, bir nesnenin [[Prototype]] öğesine doğrudan erişebilir ve değişiklik yapabilirsiniz yerleşik Object.getPrototypeOf() ve Object.setPrototypeOf() kullanarak yöntemleri:

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 }

Devralınan özellikler ile yazar tanımlı özellikleri birbirinden ayırt etmek için genellikle nesnenin "kendi özellikleri" olarak adlandırılır.

Belirtilen özellik geçerliyse yerleşik Object.hasOwn() yöntemi true değerini döndürür nesnenin doğrudan bir özelliğidir ve mülk devralınmışsa veya false mevcut değil. Mümkün olduğunda Object.hasOwn() kullanın. devre dışı bırakılan hasOwnProperty()yöntemi yerine 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

Öğrendiklerinizi sınayın

__proto__ kullanmaktan neden kaçınmalısınız?

Henüz standartlaştırılmadı.
Birçok tarayıcı tarafından desteklenmez.
Bu, kodunuzun gelecekteki bakımını yapan kişilerde kafa karışıklığına neden olur.