Prototypy i kostruktory

0

Witam
Mam taki kod

function Stor(val) {
    this.value = val;

}

Stor.prototype.get = function () {
    return this.value;
};
Stor.prototype.set = function (val) {
    this.value = val;
    return this;
}

function El(val) {
    Stor.call(this, val)
    this.value = val;
}

El.prototype = Object.create(Stor.prototype);

El.prototype.constructor = El;

//person = new Person("Bob");
let cacheStorage = {
    first: new El(true),
    second: new El(true),

}

cacheStorage.first.set("23") // set 23
Nie bardzo rozumiem ten fragment kodu

El.prototype = Object.create(Stor.prototype);
El.prototype.constructor = El;

Jak usunę El.prototype.constructor = El; kod będzie działał
jak zmienię El.prototype = Stor.prototype; kod działa
ale jak zrobię El.prototype = Object.create(Stor); wywali błąd.

Możecie mi rozjaśnić poco takie zabiegi się robi.

0

Ok
To teraz czym sie różni to
El.prototype = Object.create(Stor.prototype);
od tego
Stor.prototype
poco mi stworzenie nowego obiektu? Jakos tych prototypów nie kumam.

1

Object.create() tworzy kopię obiektu. W Twoim przypadku tworzy kopię prototypu.

El.prototype = Object.create(Stor.prototype);
El.prototype.method = function () {}; 

Kod wyżej doda funkcję method() tylko do El, ponieważ ona ma tylko kopię prototypu Stor (Stor.prototype jest niezmienny).

Natomiast:

El.prototype = Stor.prototype;
El.prototype.method = function () {};

Za to ten kod, doda funkcję method() do prototypu zarówno El jak i Stor (ponieważ tak na prawdę to jest ten sam prototyp).

0

No racja zapomniałem że poza typem prostym to jest referencja do obiektu. No i stała się jasność :)
Pozostała jeszcze jedna zagadka
El.prototype.constructor = El;
poco przypisywać konstruktor od początku i jakie będą konsekwencje jeżeli tego nie zrobię?

1

Jeśli zrobisz

El.prototype = Object.create(Stor.prototype);

to ten kod

console.log(El.prototype.constructor)

pokaże Stor. Dlatego że skopiowałeś cały prototyp z Stor (razem z prototype.constructor). A my chcemy żeby El.prototype.constructor to było El, więc trzeba to manualnie poprawić.

PS: Ma to sens wtedy kiedy El ma inny konstruktor niż Stor, i ten właśnie konstruktor chcemy nadpisać. Jeśli są takie same, to różnicy w działaniu nie ma żadnej.

0

Na pewno się zaznajomię.
Temat jeden z ważniejszych w JS a ja go tak olałem ale okazuje się że jednak muszę to opanować bo co róż utykam jak muszę jakąś bardziej rozbudowaną formę kodu stworzyć a Metoda Kopi'ego-Pejst'a przestaje działać :)
Dzieki jeszcze raz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1