568
Rozdział 12
Modyfikacje obiektów utworzonych przy użyciu konstruktora
Nawet obiekty utworzone przy użyciu konstruktora
mogą mieć własne właściwości
Napisaliśmy już całkiem sporo na temat sposobów używania konstruktorów do tworzenia
obiektów — obiektów, które będą dysponować tym samym zbiorem właściwości i tymi
samymi metodami. Nie wspominaliśmy jednak, że użycie konstruktorów nie uniemożliwia
zmiany tak utworzonego obiektu w coś innego — okazuje się, że nawet obiekty
zbudowane przy użyciu konstruktorów można zmieniać.
Ale o czym my tu właściwie mówimy? Czy pamiętasz, jak przedstawialiśmy literały
obiektowe? Dowiedziałeś się wtedy, jak można dodawać i usuwać ich właściwości po
utworzeniu takiego obiektu. Dokładnie to samo można robić z obiektami tworzonymi
przy użyciu konstruktorów.
var fido = new Dog(”Burek”, ”mieszaniec”, 20);
fido.owner = ”Kuba”;
delete fido.weight;
Możemy dodać do niego nową właściwość —
wystarczy przypisać jej jakąś wartość w obiekcie.
Oto nasz pies Burek utworzony
przy użyciu konstruktora Dog.
Możemy także usunąć właściwość,
korzystając w tym celu z operatora delete.
Możemy także dodawać do obiektu nowe metody.
fido.trust = function(person) {
return (person === ”Kuba”);
};
Aby dodać metodę, wystarczy przypisać
funkcję do nowej właściwości w obiekcie.
Alarm! Funkcja anonimowa!
Widzisz… Jesteśmy wszędzie!
Zauważ, że ta instrukcja zmienia wyłącznie obiekt
fido
. Jeśli metodę
dodamy do obiektu
fido
, tylko ten obiekt będzie nią dysponował.
Ten kod zadziała, gdyż w obiekcie fido jest
zdefiniowana metoda trust. A zatem w zmiennej
notBite zostanie zapisana wartość true.
var notBite = fido.trust(”Kuba”);
var spot = new Dog(”Kieï”, ”chihuahua”, 4);
notBite = spot.trust(”Kuba”);
Ten kod nie zadziała, gdyż w obiekcie spot nie
została zdefiniowana metoda trust; próba jego
wykonania spowoduje wyświetlenie błędu:
„TypeError: Object #<Dog> has no method ‘trust’”.
jesteś tutaj
569
Zaawansowane sposoby konstruowania obiektów
Jeśli zatem zmienię
obiekt samochodu po jego
utworzeniu, wciąż będzie
samochodem?
Tak, samochód będzie samochodem, nawet jeśli go później
zmienisz.
Mamy tutaj na myśli to, że jeśli sprawdzisz, czy Twój samochód
wciąż jest instancją
Car
, to nią będzie. Jeśli utworzymy obiekt samochodu:
var cadiParams = {make: ”GM”, model: ”Cadillac”,
year: 1955, color: ”jasnobrÈzowy”,
passengers: 5, convertible: false,
miles: 12892};
var cadi = new Car(cadiParams);
możemy do niego dodać nową właściwość, taką jak
chrome
, i usunąć starą
właściwość
convertible
:
cadi.chrome = true;
delete cadi.convertible;
a mimo to,
cadi
wciąż będzie samochodem.
cadi instnceof Car
Jednak czy to naprawdę jest samochód w jakimkolwiek praktycznym sensie?
Co by było, gdybyśmy usunęli każdą właściwość takiego obiektu? Czy to
też byłby samochód? Operator
instanceof
odpowiedziałby na to pytanie
twierdząco. Jednak najprawdopodobniej nasza ocena byłaby przeciwna.
Jest bardzo prawdopodobne, że raczej sporadycznie będziemy chcieli
tworzyć obiekty przy użyciu konstruktora i potem zmieniać je w coś,
czego nie da się rozpoznać jako obiektu utworzonego za pomocą tego
konstruktora. Ogólnie rzecz biorąc, z konstruktorów korzysta się zazwyczaj
do tworzenia obiektów o identycznej postaci. Jeśli jednak potrzebujemy
bardziej elastycznych obiektów, to cóż… JavaScript da sobie z nimi
radę. To Twoim zadaniem, jako projektanta kodu, jest wybór takiego
sposobu korzystania z konstruktorów i obiektów, który będzie dla Ciebie
(oraz Twoich współpracowników) najbardziej sensowny.
To właśnie to
mieliśmy na myśli,
wcześniej pisząc,
że JavaScript ma
dynamiczny system
typów.
Zwraca wartość true.
Get Programowanie w JavaScript Rusz głową! now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.