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 |
#3 · Zasláno: 9. 8. 2012, 13:18:28
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 |
#5 · Zasláno: 9. 8. 2012, 13:38:40
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. |
||
Časová prodleva: 12 let
|
0