Получить владельца экземпляра метода

#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();