Istnieje błędne przekonanie, że „to” jest podobne do „tego” lub „ja” w innych językach OO. Ale to nie jest prawdą. „To” w JS jest zupełnie inne.
Po pierwsze, „this” nie jest this w instancji klasy. W JS nie ma prawdziwej klasy. istnieją tylko funkcje i obiekty oraz inne prymitywy. Funkcje nazywane są obiektami funkcyjnymi, ponieważ one również są obiektami.
W OO dziedziczenie oznacza kopiowanie. Chociaż w JS istnieją rzeczy zwane dziedziczeniem, takie jak dziedziczenie prototypów, ale ułatwia to zrozumienie osobom zaznajomionym z dominującą ideą OO. W JS obiekty można łączyć ze sobą za pomocą łańcucha prototypów, ale nie ma tu miejsca żadne kopiowanie, a jedynie łączenie.
Kiedy wywołujesz funkcję w JS, „to” jest w tym momencie wiązane i może się różnić w różnych scenariuszach.
Pierwszy z nich nazywa się domyślnym powiązaniem.
function foo() { console.log(this); } foo();
Zadeklarowałeś funkcję i uruchomiłeś ją. W tym przypadku „to” jest powiązane z obiektem globalnym, którym jest Okno w przeglądarce. Lub „nieokreślony” w trybie ścisłym.
Drugie to niejawne wiązanie:
function foo() { console.log(this); } let obj = { test: foo } obj.test();
W tym przypadku, ponieważ wywołałeś funkcję za pomocą „obj.”, następuje niejawne wiązanie, więc „this” w foo jest powiązane z obj.
Trzecie to jawne wiązanie:
let myThis = { name: 'steve' } function foo() { console.log(this); } foo.call(myThis);
W tym przypadku, gdy wywołujesz foo, wyraźnie mówisz mu, aby używał myThis jako „tego” wewnątrz funkcji.
Wreszcie, czy jest „nowe” wiązanie:
function Foo() { this.fname = 'steve'; } let obj = new Foo(); // obj = {fname: 'steve'}
W tym przypadku kompilator, jak rozumiem, robi to:
let obj = {}; obj = Foo.call(obj);
Nawiasem mówiąc, nie zaleca się używania słowa „nowy” do udawania zachowania klasy w JS. Skorzystajmy ze wzoru OOLO.
Nauczyłem się tego wszystkiego z książki „You-not-wiesz-JS”. To naprawdę dobra książka, która pozwala uzyskać dogłębne zrozumienie JS. Gorąco polecam ją średniozaawansowanym i zaawansowanym programistom JS.