Object.create()

Jednym z kolejnych sposobów na tworzenie obiektów jest użycie funkcji Object.create(), która służy do tworzenia nowych obiektów.

Jako pierwszy parametr przyjmuje ona obiekt, który stanie się prototypem nowo tworzonego obiektu:

const car = { //to będzie nasz prototyp
    drive() {
        console.log(this.name + " jadę");
    },
    refuel() {
        console.log(this.name + " tankuję");
    },
    stop() {
        console.log(this.name + " zatrzymuję się");
    }
}

const c1 = Object.create(car);
c1.name = "Samochód 1";
c1.drive(); //Samochód 1 jadę

const c2 = Object.create(car);
c2.name = "Samochód 2";
c2.drive(); //Samochód 2 jadę

console.log(c1);
console.log(c2);

Drugim opcjonalnym parametrem Object.create() jest obiekt, w którym możemy ustawić właściwości nowo tworzonego obiektu:

Deskryptory właściwości

W odróżnieniu od klasycznego ustawiania właściwości (np. c1.name = "Maluch"), przy zastosowaniu Object.create() mamy tutaj dodatkowe możliwości, ponieważ każdą tak tworzoną właściwość możemy opisaćarrow-up-right poprzez dodatkowe cechy:

enumerable
czy wartość ma być widoczna przy pętlach iteracyjnych (np. for in, for of itp.) - np. właściwość length nie jest enumerable

writable

czy zmienna może być zmieniana np. car.name = "Fiat"

configurable

czy zmienna może mieć później zmieniane cechy - np. czy możemy później zmienić ją na nie enumerable, lub czy będziemy mogli ją usunąć poprzez delete)

value

wartość tej właściwości. Nie można tego używać wraz z get/set

get

tak zwany getter - funkcja wywoływana gdy pobieramy daną wartość

set

tak zwany setter - funkcja wywoływana gdy ustawiamy daną wartość

Podobnie jak w przypadku poprzedniego rozdziału możemy to też połączyć z geterami i seterami:

defineProperty()

W powyższym kodzie stworzyliśmy obiekt, od razu przy tym ustawiając jego właściwości. Możemy też takie właściwości dodawać poza ciałem obiektu za pomocą defineProperty():

Powyższe definiowanie właściwości możemy też połączyć z konstruktorem:

Enumerable

Jak spojrzysz powyżej, jedną z właściwości jest enumerable, która oznacza, czy dana zmienna ma być listowana gdy wykonujemy pętlę na danym obiekcie. Sprawdźmy to na przykładzie:

Powyżej mamy tablicę - czyli obiekt. Jak widzisz, gdy wypisujemy nasz obiekt za pomocą console.dir, wypisane są jego wszystkie klucze wraz z length.

Jeżeli jednak zrobimy pętlę po takim obiekcie, zostaną uwzględnione tylko klucze iterowalne:

Spróbujmy to zrobić na naszym obiekcie:

Oznacza to, że tworząc w klasyczny sposób obiekty, wszystkie ich klucze są iterowalne.

Korzystając z funkcji Object.create możemy zdecydować, które właściwości naszego obiektu będą iterowalne:

Żeby sprawdzić jakie cechy ma dana właściwość, możemy posłużyć się funkcją Object.getOwnPropertyDescriptor():

Jeżeli temat cię zainteresował polecam dodatkowe artykuły na ten temat:

Last updated