-
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?