Obiekty

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?

Zapis liniowy
Zapis okresu
Zapis kropki
Zapis nawiasu klamrowego

Która z poniższych składni jest prawidłowa do pobrania wartości z myProp

myObj{"myProp"};
myObj["myProp"];
myObj("myProp");