VytvoÅenà objektu stejným konstruktorem
PÅedstavme si, že máme libovolný objekt obj, který je vytvoÅen konstruktorem â nevÃme jakým, ale rádi bychom pomocà nÄj vytvoÅili nový objekt.
Můžeme to udÄlat takto?
let obj2 = new obj.constructor();
UveÄte pÅÃklad konstruktoru pro obj, pro který by takový kód správnÄ fungoval. A pÅÃklad, pro který by fungoval Å¡patnÄ.
Tento pÅÃstup můžeme použÃt, pokud jsme si jisti, že vlastnost "constructor" obsahuje správnou hodnotu.
NapÅÃklad pokud se nedotkneme standardnà vlastnosti "prototype", pak bude tento kód zaruÄenÄ fungovat:
function Uživatel(jméno) {
this.jméno = jméno;
}
let uživatel = new Uživatel('Jan');
let uživatel2 = new uživatel.constructor('Petr');
alert( uživatel2.jméno ); // Petr (funguje!)
Funguje to, protože Uživatel.prototype.constructor == Uživatel.
â¦Ale pokud nÄkdo dejme tomu pÅepÃÅ¡e Uživatel.prototype a zapomene znovu vytvoÅit constructor, aby odkazoval na Uživatel, pak to selže.
NapÅÃklad:
function Uživatel(jméno) {
this.jméno = jméno;
}
Uživatel.prototype = {}; // (*)
let uživatel = new Uživatel('Jan');
let uživatel2 = new uživatel.constructor('Petr');
alert( uživatel2.jméno ); // undefined
ProÄ je uživatel2.jméno undefined?
Takto funguje new uživatel.constructor('Petr'):
- Nejprve hledá
constructorv objektuuživatel. Nic. - Pak postupuje ÅetÄzcem prototypů. Prototyp objektu
uživateljeUživatel.prototypea ani ten nemá žádnýconstructor(protože jsme ho âzapomnÄliâ správnÄ nastavit!). - Postupuje ÅetÄzcem dále nahoru.
Uživatel.prototypeje planý objekt a jeho prototypem je vestavÄnýObject.prototype. - Nakonec pro vestavÄný
Object.prototypeje vestavÄnýObject.prototype.constructor == Object. Ten se tedy použije.
Nakonec tedy máme let uživatel2 = new Object('Petr').
To pravdÄpodobnÄ nenà to, co chceme. Rádi bychom vytvoÅili new Uživatel, ne new Object. To je důsledek chybÄjÃcà vlastnosti constructor.
(Jen pro pÅÃpad, že vás to zajÃmá: volánà new Object(...) konvertuje svůj argument na objekt. To je teoretická záležitost, v praxi nikdo nevolá new Object s hodnotou a obecnÄ vůbec nepoužÃváme new Object k vytváÅenà objektů.)