Краткий ответ: вызовите функцию через call
и передайте предполагаемый this
в качестве первого аргумента.
function test(value) {
this.prop = value
}
// 'this' v v value
test.call(test, 10)
console.log(test.prop) // 10
Цель call
- явно установить this
длявызванная функция.
Объяснение:
Для нестрого режима, когда функция вызывается без вызывающей стороны, например, test(10)
,this
неявно установлен на глобальный объект, в данном случае window
.В строгом режиме это будет undefined
.
function test() {
return this
}
console.log(test()) // window (or undefined in strict mode)
Внутри функции, this
относится к вызывающей функции.
const caller = {
test: function () { return this }
}
console.log(caller.test()) // caller, i.e., { test: function() {...} }
Это верно и для «классов» (функции, вызываемые с new
).
function MyConstructor() {
this.test = function() {
return this
}
}
const instance = new MyConstructor()
console.log(instance.test()) // instance of MyConstructor
В зависимости от вашего варианта использования может быть предпочтительнее использовать эту форму:
const myObj = {
test: function(value) {
this.prop = value
}
}
// 'prop' will be set on `myObj` instead of the function.
myObj.test(10)
console.log(myObj) // { prop: 10, test: function(value) {...} }
или классоподобную конструкцию:
function MyConstructor(value) {
this.prop = value
}
const instance = new MyConstructor(10)
console.log(instance) // MyConstructor { prop: 10 }
console.log(instance.prop) // 10