Wartość wskaźnika this zależy od kontekstu wywołania funkcji

Wywołanie konstruktora

operator new albo funkcja Object.create()

this wskazuje na obiekt zwrócony przez konstruktor.

const obj = {
  counter: 0,
  plus: function() {
    this.counter++
  },
  minus: function() {
    this.counter--
  },
}
const A = Object.create(obj)
const B = Object.create(obj)
A.plus()
A.plus()
B.minus()

console.log(A === B) // false
console.log(A === obj) // false
console.log(A.counter, B.counter) // 2 -1

Wywołanie funkcji

this wskazuje na obiekt zawierający wywoływaną funkcję

const obj = {
  init: function() {
    this.counter = 0
    return this
  },
  plus: function() {
    this.counter++
  },
  minus: function() {
    this.counter--
  },
}
const A = obj.init()
const B = obj.init()
A.plus()
A.plus()
B.minus()

console.log(A === B) // true
console.log(A === obj) // true
console.log(A.counter, B.counter) // 1 1

Wiązanie jawne

można wskazać konkretny obiekt za pomocą .call() albo .bind()

Leksykalne this

arrow function