|
75 | 75 | - [pokročilé regEx znaky](#pokročilé-regex-znaky)
|
76 | 76 | - [OOP (Objektově Orientované Programování)](#oop-objektově-orientované-programování)
|
77 | 77 | - [Začátek OOP](#začátek-oop)
|
| 78 | + - [vytváření objektů (bez tříd)](#vytváření-objektů-bez-tříd) |
| 79 | + - [vytváření objektů (s třídami)](#vytváření-objektů-s-třídami) |
| 80 | +- [čtyři hlavní pilíře OOP](#čtyři-hlavní-pilíře-oop) |
| 81 | + - [Encapsulation (Zapouzdření)](#encapsulation-zapouzdření) |
| 82 | + - [Abstraction (Abstrakce)](#abstraction-abstrakce) |
| 83 | + - [Inheritance (Dědičnost)](#inheritance-dědičnost) |
| 84 | + - [Polymorphism (Polymorfizmus)](#polymorphism-polymorfizmus) |
78 | 85 |
|
79 | 86 | ## Úvod
|
80 | 87 |
|
@@ -1137,3 +1144,134 @@ a jeho vlastnosti "hodnota" s atributem "vnitrni hodnota".
|
1137 | 1144 | Kdyby tam v objektu byl další objekt budeme postupovat stejně abychom ho mohli použít.
|
1138 | 1145 | */
|
1139 | 1146 | ```
|
| 1147 | + |
| 1148 | +## vytváření objektů (bez tříd) |
| 1149 | + |
| 1150 | +V JS je více způsobů jak zakládat `objekty`, první z nich je použít funkci jako třídu, tato metoda dokáže skoro všechno co použití `tříd`. Tato metoda plýtvá více pamětí a je náročnější ale pokud děláme pouze pár objektů tak to nevadí. |
| 1151 | + |
| 1152 | +```js |
| 1153 | +function clovek(vek, jmeno){ //založení funkce, neboli konstrukteru (constructor) |
| 1154 | + let osoba = { // založení objektu |
| 1155 | + vek : vek, //nastavení věku podle vstupu |
| 1156 | + jmeno : jmeno, |
| 1157 | + pozdrav(){ //založení funkce (metody) pro tento specifický objekt, tata metoda při každém zavoláním vypíše "ahoj Pavel", pokud jméno je Pavel |
| 1158 | + console.log("ahoj", osoba.jmeno) |
| 1159 | + } |
| 1160 | + } |
| 1161 | + |
| 1162 | + return osoba //vrátí objekt |
| 1163 | +} |
| 1164 | + |
| 1165 | +let osoba = clovek(19, "Pavel") //zavolání konstruktoru |
| 1166 | +osoba.pozdrav() // zavolání metody "pozdrav" z objektu |
| 1167 | +console.log(osoba.vek) //vypíše proměnnou věk objektu |
| 1168 | +``` |
| 1169 | + |
| 1170 | +**pozn. `dědičnost` je možná i s tímto způsobem ale je to zbytečně složité, takže doporučuji využít `třídy` / `class`, které vysvětluji v další kapitole. |
| 1171 | + |
| 1172 | +## vytváření objektů (s třídami) |
| 1173 | + |
| 1174 | +V JS můžeme používat i třídy, které používají klíčové slovo `class` a název této třídy. Konstruktor třídy má klíčové slovo `constructor` a přijímá všechny proměnné, které potřebujeme. metody se definují jako `nazev(){}` neboli stejně jako funkce ale bez klíčového slova `function`. V třídách se používá klíčové slovo `this`, které je k tomu abychom mohli ukazovat na objekt se kterým pracujeme. Při zakládání objektu tímto způsobem, tak uděláme `let objekt = new třída(proměnné)` a musíme použít klíčové slovo `new`. |
| 1175 | + |
| 1176 | +```js |
| 1177 | +class clovek{ //založení třídy clovek |
| 1178 | +constructor(vek, jmeno){ //konstruktor třídy člověk co přijímá proměnné věk a jméno |
| 1179 | + this.vek = vek //nastavení tomuto objektu věk |
| 1180 | + this.jmeno = jmeno |
| 1181 | + } |
| 1182 | + |
| 1183 | + pozdrav(){ //metody, která pozdraví podle jména objektu |
| 1184 | + console.log("ahoj", this.jmeno) |
| 1185 | + } |
| 1186 | +} |
| 1187 | + |
| 1188 | +let osoba = new clovek(19, "Pavel") //založení objektu třídy s parametry co jsme zadali |
| 1189 | +osoba.pozdrav() // pozdraví podle jména objektu |
| 1190 | +console.log(osoba.vek) //vypíše proměnnou věk objektu |
| 1191 | +``` |
| 1192 | + |
| 1193 | +# čtyři hlavní pilíře OOP |
| 1194 | + |
| 1195 | +1. Encapsulation (Zapouzdření) |
| 1196 | +2. Abstraction (Abstrakce) |
| 1197 | +3. Inheritance (Dědičnost) |
| 1198 | +4. Polymorphism (Polymorfizmus) |
| 1199 | + |
| 1200 | +## Encapsulation (Zapouzdření) |
| 1201 | + |
| 1202 | +Zapouzdření je jeden ze čtyř pilířů OOP. Znamená to zabalení dat a metod do jednoho objektu (jednotky) a kontrolu dat uvnitř. Závisí na `privátních` (soukromých) a `public` (veřejných) datech / proměnných. V třídách (`class`) se používá `#` pro udělání soukromé proměnné, pokud se pokusíme použít proměnnou co je soukromá bez toho aby nám to vrátila nějaká metoda, tak dostaneme `undefined` zpátky. Používá se k tomu `getter` a `setter`, často se používá něco jako `getName` a `setName`. |
| 1203 | + |
| 1204 | +```js |
| 1205 | +class clovek{ //založení třídy clovek |
| 1206 | + #vek //udělání privátní vek |
| 1207 | + #jmeno //udělání privátní jmeno |
| 1208 | + constructor(vek, jmeno){ //konstruktor co nám udělá privátní vlastnosti objektu vek a jmeno |
| 1209 | + this.#vek = vek |
| 1210 | + this.#jmeno = jmeno |
| 1211 | + } |
| 1212 | + |
| 1213 | + getJmeno(){ //metoda co vrací privátní vlastnost objektu jmeno |
| 1214 | + return this.#jmeno |
| 1215 | + } |
| 1216 | +} |
| 1217 | + |
| 1218 | +let osoba = new clovek(19, "Pavel") //založení objektu |
| 1219 | +console.log(osoba.jmeno) //vrací undefined, protože jmeno je soukromé |
| 1220 | +console.log(osoba.getJmeno()) //vypíše jméno, tady "Pavel" |
| 1221 | +``` |
| 1222 | + |
| 1223 | +## Abstraction (Abstrakce) |
| 1224 | + |
| 1225 | +Abstrakce je určená k "schování" složité implementace nějaké metody, např. tím že zavoláme jednu metodu, která zavolá jiné aby udělala složitější věc. Více než teoretické vysvětlení k tomu podle mě nejde přidat. |
| 1226 | + |
| 1227 | +## Inheritance (Dědičnost) |
| 1228 | + |
| 1229 | +Dědičnost je určená k tomu abychom nemuseli opakovat kód, můžeme díky ní udělat objekt z více tříd najednou, dědí se metody a vlastnosti ze tříd. V JS se dědí pomocí klíčového slova `extends`. V konstruktoru se používá funkce `super()` s parametry co přijímá ta třída z které dědíme abychom spustili ten konstruktor rodičovské třídy. |
| 1230 | + |
| 1231 | +```js |
| 1232 | +class clovek{ //základní třída clovek |
| 1233 | + constructor(jmeno, vek){ |
| 1234 | + this.vek = vek; |
| 1235 | + this.jmeno = jmeno; |
| 1236 | + } |
| 1237 | + |
| 1238 | + pozdrav(){ |
| 1239 | + console.log(`zdraví tě`, this.jmeno) |
| 1240 | + } |
| 1241 | +} |
| 1242 | + |
| 1243 | +class student extends clovek{ //třída student, která dědí z třídy člověk |
| 1244 | + constructor(jmeno, vek, skola){ |
| 1245 | + super(jmeno, vek); //spuštění konstruktoru třídy ze které dědíme (clovek) |
| 1246 | + this.skola = skola; |
| 1247 | + } |
| 1248 | + |
| 1249 | + jakaSkola(){ //základní metoda, která vypíše nějaké data |
| 1250 | + console.log("jsem", this.jmeno, "a studuji na", this.skola) |
| 1251 | + } |
| 1252 | +} |
| 1253 | + |
| 1254 | +let p = new student("pepa", 17, "škola") //založení objektu třídy student |
| 1255 | +p.pozdrav() //použití funkce ze třídy "clovek" |
| 1256 | +p.jakaSkola() //použití funkce ze třídy "student" |
| 1257 | +``` |
| 1258 | + |
| 1259 | +## Polymorphism (Polymorfizmus) |
| 1260 | + |
| 1261 | +Polymorfizmus znamená mnoho podob (z řečtiny, poly = mnoho, morphé = tvar). V OOP to znamená že můžeme mít název metody stejný ve více třídách a neudělá to chybu jako u funkcí. |
| 1262 | + |
| 1263 | +```js |
| 1264 | +class clovek{ // třída člověk |
| 1265 | + getJmeno(){ //funkce getJmeno() |
| 1266 | + return this.jmeno //vrací jméno objektu |
| 1267 | + } |
| 1268 | +} |
| 1269 | + |
| 1270 | +class student{ |
| 1271 | + getJmeno(){ |
| 1272 | + return this.jmeno |
| 1273 | + } |
| 1274 | +} |
| 1275 | + |
| 1276 | +//kód funguje, protože metody mají stejný název jiných třídách a proto je to v pohodě |
| 1277 | +``` |
0 commit comments