#javascript #oop
#javascript #ооп
Вопрос:
Задан класс и его экземпляр
var class=function() {
this.propA=99;
this.methodA=function() {
console.log(this.propA);
};
};
var object=new Class();
Я хотел бы иметь возможность выполнить вызов methodA, где this
будет его экземпляр, и пример ( this.propA
) будет работать. Точно так же, как
object.methodA.call(object);
но без какой-либо ссылки на object
. Как это в каком-нибудь псевдокоде:
var methodToCall=object.methodA;
...
...
methodToCall.call(getInstanceOwnerOf(methodToCall));
Цель этого состоит в том, чтобы передавать методы в качестве обратных вызовов асинхронным функциям и сохранять this
в качестве экземпляра при вызове метода.
Некоторые обходные пути заключались бы в передаче method
и object
этой асинхронной функции или в сохранении this
в локальной переменной, но это те вещи, которых я хочу избежать.
Комментарии:
1. У функций нет «владельца». В том факте, что функция связана со свойством объекта, нет внутреннего смысла или значимости. Вы можете использовать
.bind()
(в прототипе функции) для создания функции с фиксированнойthis
привязкой.
Ответ №1:
Используйте bind для привязки к контексту, в котором вы хотите вызвать функцию. Обратите внимание, что это возвращает НОВУЮ функцию, которая не совпадает с исходной.
Обычно я создаю новую функцию и даю ей другое имя, но вы можете сделать это несколькими способами.
Чтобы быть более конкретным, вы не можете быть уверены, что это тот класс, в котором объявлена функция, зависит от того, как вы вызвали функцию и находитесь ли вы в строгом режиме.
пример ниже:
Скрипта:https://jsfiddle.net/f7af535L /
class SomeClass {
constructor(someVar) {
this.myVar = someVar;
this.publicSayVar = this.sayVar.bind(this);
}
sayVar() {
console.log(this.myVar);
}
}
var object = new SomeClass("hello");
var testcall = object.publicSayVar;
testcall();