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ć poprzez dodatkowe cechy:
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