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?