Obiekty są dyskretnym typem danych w taki sam sposób,
Primitive to typ danych, przy którym znajduje się jeden krytyczny
różnicy: w przeciwieństwie do elementów podstawowych obiekty są zmienne. Obiekt może zawierać dane
jest powiązana z identyfikatorami, np. zmienną, ale zachowuje swoje dane object
bez względu na to, jakie dane zawiera.
Oprócz elementów podstawowych wszystkie wartości JavaScript są obiektami, chociaż nawet literały podstawowe wykazują zachowanie podobne do obiektu, dziedziczenia prototypowego, twierdzą, że JavaScript jest właściwie złożony z obiektów.
Literał obiektu to para nawiasów klamrowych otaczających 0 lub więcej par klucz-wartość par nazywanych „właściwościami”, który może zawierać dowolną wartość JavaScript.
{
"myProperty" : true
}
Klucze usługi mogą być dowolnymi symbolem lub ciąg znaków. Tak 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 znaków z pojedynczym ('
) lub podwójnym cudzysłowem ("
) – nie
literał 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ą być zawierają obiekty o własnych właściwościach:
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, używając 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ż tak jak w przypadku każdego innego typu danych możesz użyć
obiektu bez identyfikatora wszędzie tam, gdzie powinien się znajdować obiekt. Jednak
literał obiektu wymaga nawiasów we wszystkich kontekstach, w których może być mylony
dla instrukcji bloku, gdy obie te wartości mają taką samą składnię nawiasów klamrowych ({}
).
Tego rodzaju inicjowanie zmiennej nigdy nie jest wymagane.
{ "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 znaczącej różnicy w wynikach tworzenia
obiektu za pomocą funkcji new Object()
i utworzyć literał obiektu, ponieważ
w każdym z tych przypadków będzie obiektem z właściwościami odziedziczonymi z metody
Prototyp Object
. Występuje jednak jedna praktyczna różnica między nimi
składni.
Słowo kluczowe new
musi definiować pusty obiekt, który będzie później wypełniany danymi:
let myObject = new Object();
myObject.booleanValue = true;
myObject.stringValue = "My string.";
Literał obiektu może zostać zapełniony danymi podczas jego tworzenia:
let myObject = {
'booleanValue' : true,
'stringValue' : "My string."
};
Choć new Object()
ma niewielkie zastosowanie praktyczne, można go używać do przekształcania obiektów w obiekty podstawowe
danych do obiektów odpowiedniego typu, np. tych zwróconych przez metodę
słowo kluczowe new
wraz z konstruktorem
. Na przykład poniższy jest odpowiednikiem funkcji
new Number( 10 )
:
let myObject = new Object( 10 );
myObject;
> Number { 10 }
Wartości null
i undefined
dają pusty obiekt o identycznym działaniu
wywoływania funkcji new Object()
bez podawania argumentu.
Przekazywanie literału obiektu do new Object()
jako argumentu przekazuje obiekt
dosłowny bez zmian:
let myObject = new Object( { myValue : 10 } );
myObject;
> Object { myValue: 10 }
Podobnie jak w przypadku konstruktorów dla wartości podstawowych, używania konstruktorów dla obiektów rzadko ma zalety w porównaniu z użyciem notacji dosłownego określenia obiektu. Nawet podczas tworzenia puste obiekty, które mają zostać wypełnione później wartościami, deweloperzy zwykle wolą obiekt ze względu na prostotę.
Sprawdź swoją wiedzę
Jakiego rodzaju notacji można użyć do ustawienia właściwości obiektu?
Która z poniższych składni jest prawidłowa do pobrania wartości
z myProp
myObj{"myProp"};
myObj("myProp");
myObj["myProp"];