Tak jak w przypadku innych typów danych,
obiekt dziedziczy właściwości i metody z wbudowanego prototypu Object
,
co oznacza, że wynikowy obiekt zawiera zarówno zdefiniowane właściwości, jak i
właściwość prototypu zawierająca metody odziedziczone z prototypu:
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__()
Właściwości prototypu nie są dostępne bezpośrednio za pomocą klucza usługi. Jako
możesz zauważyć w poprzednim przykładzie, że jest to sugerowane przez [[prototype]]
lub <prototype>
w przeglądarce konsol programisty i źródła
dokumentacja klucza właściwości prototypu:
// Chrome:
let emptyObject = {};
emptyObject;
> {}
[[prototype]]: Object
// Firefox:
let emptyObject = {};
emptyObject;
> Object { }
<prototype>: Object { … }
Chociaż wszystkie popularne przeglądarki używają standardu __proto__
jako standardu,
ustandaryzowane są oficjalnie i nie należy ich unikać w kodzie produkcyjnym.
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__()
Zamiast tego możesz bezpośrednio uzyskać dostęp do elementu [[Prototype]]
i zmodyfikować go
za pomocą wbudowanych interfejsów Object.getPrototypeOf()
i Object.setPrototypeOf()
metody:
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 }
Aby odróżnić właściwości odziedziczone od właściwości zdefiniowanych przez autora, funkcja ten drugi jest zwykle nazywany „własnymi właściwościami” obiektu.
Wbudowana metoda Object.hasOwn()
zwraca true
, jeśli określona właściwość
jest właściwością bezpośrednią obiektu, a false
, jeśli właściwość jest dziedziczona lub
nie istnieje. W miarę możliwości używaj Object.hasOwn()
zamiast dziedziczonej metody hasOwnProperty()
, która nie obsługuje
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
Sprawdź swoją wiedzę
Dlaczego należy unikać korzystania z usługi __proto__
?