Obiekty

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?

Zapis kropka
Notacja nawiasów
Zapis okresu
Zapis liniowy

Która z poniższych odpowiedzi jest prawidłową składnią do uzyskiwania wartości myProp

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