⊗jsOpAdCL 41 of 60 menu

Загуба на контекст в ООП в JavaScript

При работа с класове може да се загуби контекст и this ще сочи не към обекта на класа, а към нещо друго. Нека да видим как може да се случи това и какво да правим.

Нека имаме клас User, който съдържа името на потребителя и масив от градове, в които този потребител е бил:

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

Нека има метод, който извежда градовете:

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

Нека в този метод решим да използваме някакъв помощен метод на класа. В този случай контекстът ще се загуби:

class User { constructor(name, cities) { this.name = name; this.cities = cities; } showCities() { this.cities.forEach(function(city) { console.log(this.#cape(city)); // контекстът се загуби }); } #cape(str) { return str[0].toUpperCase() + str.slice(1); } }

Може да се поправи проблема, например, като се въведе стрелкова функция:

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); } }

Поправете грешката, допусната в следния код:

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);
Български
AfrikaansAzərbaycanবাংলাБеларускаяČeštinaDanskDeutschΕλληνικά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
Ние използваме бисквитки за работата на сайта, анализ и персонализация. Обработката на данни се извършва в съответствие с Политика за поверителност.
приемам всички настройки отхвърляне