V posledním videu jsme se naučili, jak vytvořit typ objektu,
který reprezentoval dva typu objektů podobných Winstonovi.
Potom jsme je inicializovali pomocí konstruktorů.
Typ objektu ale nemusí souviset pouze s vlastnostmi.
Může být také spojen s funkcionalitou.
Představte si svět a všechny typu objektů, které obsahuje.
Například my lidé.
Všichni máme výšku a věk,
ale také máme věci, které můžeme dělat,
jako třeba spát, jíst a programovat.
Chceme být schopni spojit tyto funkce s jejich typy objektů.
Tento program máme v bodě, kde jsme skončily minule.
Máme zde funkci drawWinston, kterou voláme na oba objekty Winstona.
Nebylo by hezké, kdybychom to mohli spojit s Winstonovým typem objektu?
Můžeme a je to celkem snadné.
Pod naším konstruktorem napíšeme "Winston" – velké W – tečka "prototype".
"Prototype" je nové slovo, které jste asi ještě neviděli.
Prototyp je vlastnost objektu, ke které můžeme připojit funkce.
To znamená,
že každý objekt, který je prototypem, bude obsahovat dané funkce.
Můžeme tedy napsat tečka "prototype" a poté tečka a název funkce.
Takže napíšeme "draw" rovná se a pak vezmeme náš kód z drawWinston,
který následně můžeme vložit sem dovnitř.
Takže právě jsme připojili funkci "draw" k našeme prototypu Winstona.
To znamená,
že bychom měli být schopni volat draw() u libovolného objektu typu Winston.
Měli být schopni zavolat draw() na winstonTeen nebo winstonAdult.
Když máme takovouto funkci, kterou můžeme zavolat na objektu,
nazýváme ji "method".
Takže mě teď budete slyšet, jak říkám "metoda".
Řekněme tedy, že se jedná o "draw method".
Tak a teď odstraníme tohle.
Zkusíme, jestli teď můžeme volat draw(), winstonTeen.draw()
A máme chybu.
Chybové hlášení nám říká, že "winstObject" není definován.
Předtím jsme vložili tento parametr do drawWinston,
což byl objekt typu Winston, ale teď už to nepředáváme.
Mohli bychom to změnit tak, abychom to předali.
To, co chceme předat, bude winstonTeen.
Teď to funguje, ale vypadá to opravdu nešikovně.
Již volám draw na samotném objektu.
Neměla bych vkládat znovu objekt jako takový.
To se zdá nadbytečné.
A je to pravda a neměli bychom to tak dělat.
Pojďme to smazat a zamyslet se.
Pokud jsme uvnitř objektu,
co bychom mohli použít pro přístup k vlastnostem objektu?
Když se podíváte na konstruktor,
možná si vybavíte speciální klíčové slovo "this".
Co kdybychom nahradili toto za "this"?
Takže změníme winstObject na "this".
Protože jsme teď uvnitř objektu,
tak je funkce vyhodnocena na objektu, takže "this" odkazuje na aktuální objekt.
Takže nám stačí napsat "this" a získáme přístup ke všem vlastnostem objektu.
A jak vidíte, funguje to!
Teď už nám stačí napsat winstonAdult.draw().
A bude to mít přístup k vlastnostem winstonAdult,
protože to je ten objekt, který se volá.
A to je důvod, proč je slovo "this" opravdu hodně dobré!
I když to může být trochu matoucí, když ho píšeme.
To byla spousta legrace, nyní přidejme další metodu.
Co dalšího by Winston mohl udělat?
Možná bude mluvit.
Takže uděláme Winston.prototype.talk.
Do prototypu můžeme připojit tolik metod, kolik chceme.
Napíšeme: "Jsem Winston!"
A pak napíšeme this.x+20 a this.y+150.
Nic se nestalo.
Ale to proto, že jsem tu funkci ještě nezavolala.
Pojďme si tedy promluvit, zavoláme winstonTeen.talk ().
"Jsem Winston!"
A pak napíšeme: winstonAdult.talk()
Teď máme tento objekt Winstona, který má vlastnosti: jméno, věk, x, y.
A má taky funkcionality jako chování a metody,
které fungují odlišně v závislosti na vlastnostech.
A můžeme vytvořit tolik instancí Winstona, kolik jen chceme.
A můžeme na ně zavolat kteroukoli z těchto metod.
Dost dobrý, že?