Autor Zpráva
xxxObiWan
Profil
Dobrý den,
posledních několik dní se snažím pochopit, jak se dá v JavaScriptu správně simulovat dědičnost "tříd". Došel jsem až k tomuto tutoriálu, který si myslím že i chápu, až na pár věcí.

Funkce pro dědění tříd z tutoriálu:
var extend = function(child, parent) {
    // F je pomocný dočasný konstruktor
    var F = function() { };
    F.prototype = parent.prototype;
    child.prototype = new F();
    // dobrým zvykem je, aby instance odkazovala na svůj konstruktor
    child.prototype.constructor = child;
};

// příklad volání
extend(Employee, Person);

Proč ale parent zbytečně kopíruju do nové funkce F a z ní pak zase do child? Nešlo by to zkrátit takto? Ve zmíněném tutoriálu mi "Kompletní příklad" i s testy funguje správně i s mou úpravou:
var extend = function(child, parent) {
    child.prototype = new parent();
    child.prototype.constructor = child;
};

Díky za vysvětlení
Radek9
Profil
xxxObiWan:
Pokud konstruktor parent nic nedělá, pak by to zkrátit šlo, ale pokud dělá, tak vše, co se provede, se rovnou promítne i do nového prototypu. Takže prostě jeho prototyp nasadíme na čistou funkce, z ní uděláme instanci a kontruktor rodiče si zavoláme až v instanci:
function MyClass(...){
  this.parent(...);
  ...
}
extend(MyClass, Parent);
xxxObiWan
Profil
To moc nechápu. Když srovnám ty dvě funkce a jejich části, kdy se do child.prototype ukládá rodič, tak:

// Ve funkci z tutoriálu: 
child.prototype = new F();  // F obsahuje parent.prototype, takže se volá vlastně: new parent.prototype.constructor(); 

// V mojí zkrácené funkci
child.prototype = new parent();  // tady taky vlastně volám: new parent.prototype.constructor();

Jak je vidět v komentáři v kódu, provede se vlastně to samé. Nebo mi něco uniká?
_es
Profil
xxxObiWan:
V prvej funkcii je o jeden objekt v reťazci prototypov viac.
xxxObiWan
Profil
Už mi to asi došlo. Ono new F.prototype.constructor() nemusí být vždy stejné, jako new F() (původně jsem si myslel, že new F() se automaticky přeloží jako new F.prototype.constructor(), ale není tomu tak).
Radek9
Profil
xxxObiWan:
Přesně tak. Proto vlastně konstruktor sám od sebe nic neudělá. Vytvoří se jen prázdný objekt, jehož __proto__vlastnost směřuje na parent.prototype. Stejnou funkcionalitu ti vlastně nabízí ES5 funkce Object.create.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0