Prototip devri

Diğer veri türlerinde olduğu gibi bir nesne de özellikleri ve yöntemleri yerleşik bir Object prototipinden devralır. Sonuçta elde edilen nesne hem tanımladığınız özellikleri hem de prototipten devralınan yöntemleri içeren bir prototip özelliğini içerir:

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 özelliklere, özellik anahtarı tarafından doğrudan erişilmesi amaçlanmamıştır. Önceki örnekte de görebileceğiniz gibi bu, tarayıcıların geliştirici konsollarında ve prototipin özellik anahtarıyla ilgili belge kaynaklarında kullanılan [[prototype]] veya <prototype> gösteriminden ima edilmektedir:

// 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 durum resmi olarak standartlaştırılmamıştır ve üretim kodunda bundan 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, yerleşik Object.getPrototypeOf() ve Object.setPrototypeOf() yöntemlerini kullanarak bir nesnenin [[Prototype]] öğesine doğrudan erişebilir ve bunu değiştirebilirsiniz:

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" adı verilir.

Yerleşik Object.hasOwn() yöntemi, belirtilen özellik nesnenin doğrudan bir özelliğiyse true değerini ve özellik devralınmışsa veya mevcut değilse false değerini döndürür. Mümkün olduğunda, Object.create() özelliğini desteklemeyen devralınan hasOwnProperty()yöntemi yerine Object.hasOwn() yöntemini kullanın.

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

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

Standartlaştırılmamıştır.
Birçok tarayıcı tarafından desteklenmez.
Bu, ileride kod yazacak kişilerin kafasını karıştıracaktır.