⊗jsOpAdCL 41 of 60 menu

Ztráta kontextu v OOP v JavaScriptu

Při práci s třídami může dojít ke ztrátě kontextu a this bude ukazovat ne na objekt třídy, ale na něco jiného. Podívejme se, jak k tomu může dojít a co s tím dělat.

Předpokládejme, že máme třídu User, která obsahuje jméno uživatele a pole měst, ve kterých tento uživatel byl:

class User { constructor(name, cities) { this.name = name; this.cities = cities; } }

Předpokládejme, že existuje metoda, která vypisuje města:

class User { constructor(name, cities) { this.name = name; this.cities = cities; } showCities() { this.cities.forEach(function(city) { console.log(city); }); } }

Předpokládejme, že jsme se v této metodě rozhodli použít nějakou pomocnou metodu třídy. V tomto případě se kontext ztratí:

class User { constructor(name, cities) { this.name = name; this.cities = cities; } showCities() { this.cities.forEach(function(city) { console.log(this.#cape(city)); // kontext se ztratil }); } #cape(str) { return str[0].toUpperCase() + str.slice(1); } }

Problém lze vyřešit například zavedením šipkové funkce:

class User { constructor(name, cities) { this.name = name; this.cities = cities; } showCities() { this.cities.forEach(city => { console.log(this.#cape(city)); }); } #cape(str) { return str[0].toUpperCase() + str.slice(1); } }

Opravte chybu, které byla provedena v následujícím kódu:

class Employee { constructor(name, salary, coeffs) { this.name = name; this.salary = salary; this.coeffs = coeffs; } getTotal() { return this.coeffs.reduce(function(res, coeff) { return res + this.salary * coeff; }, 0); } } let employee = new Employee('john', 1000, [1.1, 1.2, 1.3]); let total = employee.getTotal(); console.log(total);
Čeština
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Používáme soubory cookie pro fungování webu, analýzu a personalizaci. Zpracování údajů probíhá v souladu s Zásadami ochrany osobních údajů.
přijmout vše přizpůsobit odmítnout