⊗jsOpAdCL 41 of 60 menu

Utrata kontekstu w OOP w JavaScript

Podczas pracy z klasami może dojść do utraty kontekstu i this będzie wskazywać nie na obiekt klasy, ale na coś innego. Przyjrzyjmy się, jak może do tego dojść i co z tym zrobić.

Załóżmy, że mamy klasę User, która zawiera nazwę użytkownika i tablicę miast, w których ten użytkownik był:

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

Załóżmy, że istnieje metoda, która wypisuje miasta:

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

Załóżmy, że w tej metodzie postanowiliśmy użyć pewnej pomocniczej metody klasy. W tym przypadku kontekst zostanie utracony:

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

Problem można naprawić, na przykład, wprowadzając funkcję strzałkową:

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

Popraw błąd popełniony w następującym kodzie:

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);
Polski
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Wykorzystujemy pliki cookie do działania strony, analizy i personalizacji. Przetwarzanie danych odbywa się zgodnie z Polityką prywatności.
zaakceptuj wszystkie dostosuj odrzuć