Obiekty to typ danych dyskretnych w taki sam sposób, w jaki każdy element podstawowy jest typem danych. Występuje tu jednak jedna istotna różnica: w przeciwieństwie do obiektów podstawowych obiekty są zmienne. Obiekt może zawierać dane powiązane z identyfikatorami (np. zmienną), ale zachowuje typ danych object
niezależnie od tego, jakie dane zawiera.
Wszystkie wartości JavaScriptu, oprócz elementów podstawowych, są obiektami. Nawet literały podstawowe zachowują się tak samo z powodu dziedziczenia prostego, dlatego często mówi się, że JavaScript w praktyce składa się z obiektów.
Literał obiektu to para nawiasów klamrowych otaczających 0 lub więcej par klucz-wartość zwanych „właściwościami”, które mogą zawierać dowolną wartość JavaScript.
{
"myProperty" : true
}
Klucze właściwości mogą być dowolnym symbolem lub ciągiem znaków. Podobnie jak przy przypisywaniu identyfikatora do zmiennej ciągi znaków używane jako klucze właściwości powinny być przewidywalne i opisowe:
let carAttributes = {
"color" : "red"
};
carAttributes
> Object { color: "red" }
Klucze właściwości wymagają literału ciągu tekstowego ujętego w jednym ('
) lub podwójnym cudzysłowie ("
), a nie literalu szablonu:
let carAttributes = {
`keyString` : false
};
> Uncaught SyntaxError: expected property name, got template literal
Wartościami właściwości mogą być dowolne typy danych. Właściwości obiektu mogą same zawierać obiekty z własnymi właściwościami:
let myObject = {
'key' : {
'subkey' : true,
'othersubkey' : false
}
};
myObject;
> Object { key: Object { subkey: true, othersubkey: false } }
Gdy wartością właściwości jest funkcja, jest ona nazywana „metodą”.
const myObject = {
"myProperty" : true,
myMethod() {
console.log( "This is a method." );
}
}
myObject.myProperty;
> true
myObject.myMethod();
> "This is a method."
Możesz też utworzyć obiekt przy użyciu słowa kluczowego new
:
let myObject = new Object();
W poprzednich przykładach nowo utworzone literały obiektów zostały przypisane do zmiennych. Nie jest to wymagane, ponieważ podobnie jak w przypadku każdego innego typu danych możesz używać obiektów bez identyfikatora wszędzie tam, gdzie oczekiwany jest obiekt. Literał obiektu wymaga jednak nawiasów w każdym kontekście, w którym można go pomylić z instrukcją bloku, ponieważ te 2 mają wspólną składnię nawiasów klamrowych ({}
). Inicjowanie zmiennej nigdy tego nie wymaga.
{ "value" : 2 }
> Uncaught SyntaxError: unexpected token: ':'
({ "value" : 2 })
> Object { value: 2 }
let valObj = { "value" : 2 };
valObj;
> Object { value: 2 }
W przeciwieństwie do elementów podstawowych nie ma istotnych różnic w wynikach tworzenia obiektu za pomocą funkcji new Object()
i literału obiektu, ponieważ w obu przypadkach będzie to obiekt z właściwościami odziedziczonymi z prototypu Object
. Występuje jednak między nimi
jedna praktyczna różnica.
Słowo kluczowe new
musi definiować pusty obiekt, który zostanie później wypełniony danymi:
let myObject = new Object();
myObject.booleanValue = true;
myObject.stringValue = "My string.";
Literał obiektu może zostać wypełniony danymi podczas jego tworzenia:
let myObject = {
'booleanValue' : true,
'stringValue' : "My string."
};
Chociaż funkcja new Object()
ma niewielkie zastosowanie w praktyce, może służyć do przekształcania podstawowych wartości danych w obiekty odpowiedniego typu, np. tych zwracanych po użyciu słowa kluczowego new
w połączeniu z funkcją konstruktora. Na przykład ten kod jest funkcjonalnie odpowiednikiem new Number( 10 )
:
let myObject = new Object( 10 );
myObject;
> Number { 10 }
Wartości null
i undefined
dają pusty obiekt, funkcjonalnie identyczny z wywołaniem funkcji new Object()
bez podawania argumentu.
Przekazywanie literału obiektu do funkcji new Object()
w ramach argumentu powoduje przekazanie literału obiektu bez jego zmiany:
let myObject = new Object( { myValue : 10 } );
myObject;
> Object { myValue: 10 }
Podobnie jak w przypadku stosowania konstruktorów na potrzeby wartości podstawowych, stosowanie konstruktorów do obiektów rzadko daje jakiekolwiek korzyści w porównaniu z notacją literału obiektów. Nawet gdy tworzysz puste obiekty, które mają później zostać wypełnione wartościami, deweloperzy często preferują zapis dosłowny obiektów ze względu na prostotę.
Sprawdź swoją wiedzę
W jakim formacie można użyć zapisu właściwości obiektu?
Która z poniższych odpowiedzi jest prawidłową składnią do uzyskiwania wartości myProp
myObj["myProp"];
myObj{"myProp"};
myObj("myProp");