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?