Pamatujte, že nové objekty mohou být vytvoÅeny konstruktorem, napÅÃklad new F().
Pokud vlastnost F.prototype obsahuje objekt, pak operátor new jej nastavà jako [[Prototype]] novÄ vytvoÅenému objektu.
JavaScript mÄl prototypovou dÄdiÄnost již od zaÄátku. Byl to jeden z klÃÄových prvků jazyka.
V dÅÃvÄjÅ¡Ãch dobách k nà vÅ¡ak nebyl pÅÃmý pÅÃstup. SpolehlivÄ fungovala jedinÄ vlastnost konstruktoru "prototype", popsaná v této kapitole. Existuje tedy mnoho skriptů, které ji stále využÃvajÃ.
ProsÃme vÅ¡imnÄte si, že F.prototype zde znamená regulérnà vlastnost jménem "prototype" funkce F. Trochu se to podobá pojmu âprototypâ, ale tady máme opravdu na mysli obvyklou vlastnost s tÃmto názvem.
Zde je pÅÃklad:
let zvÃÅe = {
žere: true
};
function KrálÃk(jméno) {
this.jméno = jméno;
}
KrálÃk.prototype = zvÃÅe;
let králÃk = new KrálÃk("BÃlý králÃk"); // králÃk.__proto__ == zvÃÅe
alert( králÃk.žere ); // true
Nastavenà KrálÃk.prototype = zvÃÅe znamená doslova toto: âKdyž bude vytvoÅen new KrálÃk, pÅiÅaÄ zvÃÅe do jeho vlastnosti [[Prototype]]â.
Výsledný obrázek je následujÃcÃ:
Na obrázku je "prototype" vodorovná Å¡ipka, která znamená regulérnà vlastnost, a [[Prototype]] je svislá Å¡ipka, která znamená dÄdÄnà objektu králÃk z objektu zvÃÅe.
F.prototype bude použita jen pÅi new FVlastnost F.prototype bude použita, jen když je volán new F. PÅiÅadà [[Prototype]] novému objektu.
Jestliže se po vytvoÅenà objektu vlastnost F.prototype zmÄnà (F.prototype = <jiný objekt>), pak nové objekty vytvoÅené pomocà new F budou mÃt jako [[Prototype]] jiný objekt, ale již existujÃcÃm objektům zůstane starý prototyp.
Standardnà F.prototype, vlastnost konstruktoru
Vlastnost "prototype" má každá funkce, i když ji neuvedeme.
Standardnà "prototype" je objekt s jedinou vlastnostà constructor, která ukazuje zpÄt na samotnou funkci.
NapÅÃklad takto:
function KrálÃk() {}
/* standardnà prototyp
KrálÃk.prototype = { constructor: KrálÃk };
*/
Můžeme si to ovÄÅit:
function KrálÃk() {}
// standardnÄ:
// KrálÃk.prototype = { constructor: KrálÃk }
alert( KrálÃk.prototype.constructor == KrálÃk ); // true
Jestliže nic nezmÄnÃme, bude vlastnost constructor dostupná skrz [[Prototype]] vÅ¡em králÃkům:
function KrálÃk() {}
// standardnÄ:
// KrálÃk.prototype = { constructor: KrálÃk }
let králÃk = new KrálÃk(); // dÄdà z {constructor: KrálÃk}
alert(králÃk.constructor == KrálÃk); // true (z prototypu)
Vlastnost constructor můžeme použÃt k vytvoÅenà nového objektu stejným konstruktorem, jakým byl vytvoÅen stávajÃcà objekt.
NapÅÃklad zde:
function KrálÃk(jméno) {
this.jméno = jméno;
alert(jméno);
}
let králÃk = new KrálÃk("BÃlý králÃk");
let králÃk2 = new králÃk.constructor("Äerný králÃk");
To se hodÃ, když máme objekt, nevÃme, jaký konstruktor pro nÄj byl použit (napÅ. protože pocházà z knihovny tÅetà strany), a potÅebujeme vytvoÅit dalšà objekt stejného druhu.
Asi nejdůležitÄjšà vÄcà na "constructor" je vÅ¡ak to, žeâ¦
â¦samotný JavaScript správnou hodnotu vlastnosti "constructor" nezajišťuje.
Ano, nacházà se ve standardnà vlastnosti funkcà "prototype", ale to je vÅ¡e. Co se s nà stane pozdÄji, je zcela na nás.
KonkrétnÄ, jestliže standardnà prototyp úplnÄ nahradÃme nÄÄÃm jiným, žádný "constructor" v nÄm nebude.
NapÅÃklad:
function KrálÃk() {}
KrálÃk.prototype = {
skáÄe: true
};
let králÃk = new KrálÃk();
alert(králÃk.constructor === KrálÃk); // false
Abychom tedy udrželi správný "constructor", můžeme se rozhodnout, že budeme vlastnosti pÅidávat do a odebÃrat ze standardnÃho "prototype", mÃsto abychom jej úplnÄ mÄnili:
function KrálÃk() {}
// NepÅepÃÅ¡eme KrálÃk.prototype úplnÄ
// jen do nÄj nÄco pÅidáme
KrálÃk.prototype.skáÄe = true
// standardnà KrálÃk.prototype.constructor se zachová
Nebo alternativnÄ vlastnost constructor vytvoÅÃme znovu ruÄnÄ:
KrálÃk.prototype = {
skáÄe: true,
constructor: KrálÃk
};
// nynà je constructor také korektnÃ, protože jsme jej pÅidali
ShrnutÃ
V této kapitole jsme krátce popsali způsob, jak nastavit [[Prototype]] pro objekty vytvoÅené konstruktorem. PozdÄji uvidÃme pokroÄilejšà programovacà vzory, které jsou na tom postaveny.
VÅ¡echno je zcela jednoduché, jen nÄkolik poznámek, abychom si to ujasnili:
- Vlastnost
F.prototype(nepleÅ¥te si ji s[[Prototype]]) nastavÃ[[Prototype]]nových objektů, když je zavolánnew F(). - Hodnota
F.prototypeby mÄla být buÄ objekt, nebonull: jiné hodnoty nefungujÃ. - Vlastnost
"prototype"má tento speciálnà efekt jen tehdy, když je nastavena na konstruktoru a ten je zavolán pomocÃnew.
Na bÄžných objektech prototype neznamená nic zvláštnÃho:
let uživatel = {
jméno: "Jan",
prototype: "Ble-ble" // vůbec žádná magie
};
StandardnÄ majà vÅ¡echny funkce F.prototype = { constructor: F }, takže můžeme zÃskat konstruktor objektu pÅÃstupem k jeho vlastnosti "constructor".
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)