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.