Предполагая, что функции в javascript являются объектами, как я могу назначить свойства этому объекту функции внутри самой функции.
Ниже не работает ключевое слово "this", ссылающееся на объект окна, поэтому "prop" будет присвоен глобальному объекту окна не объекту функции.
function test() {
this.prop = value;
}
Почему это ключевое слово внутри глобальных функций относится к объекту окна и не относится к самому объекту функции?
Редактировать:
Мой вопрос отличается от повторяющегося вопроса, поскольку я задаю вопрос о том, как назначить свойство глобальной функции внутри этой функции, а не области переменных.
Ссылка на функцию по имени:
function test(value) {
test.prop = value;
}
test('hello');
console.log(test.prop); // => "hello"
Короткий ответ: вызовите функцию с помощью 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
call
вполне адекватна и фактически помогает продемонстрировать поведение this
в контексте вопроса.