Могу ли я вернуть функцию тем же способом, что и средство получения?

#angular #typescript

#angular #typescript

Вопрос:

Я пишу оболочку для console.log(), чтобы у меня был некоторый контроль над ее запуском.

Я могу заставить ее работать, когда я использую средство получения, но я хочу использовать обычную функцию, чтобы я мог передавать некоторые аргументы.

Я хочу, чтобы она функционировала так же, как при использовании средства получения, поскольку оно выводит правильный класс и номер строки в консоли.

Когда я использую средство получения, на консоль выводится правильное сообщение, имя класса и номер строки:

 get info() {
        return console.info.bind(console);
}
  

вызывается:

 this.logger.info('this is a log');
  

результаты в консоли:

это журнал

Когда я использую функцию, ничего не выводится на консоль

 public info() {
        return console.info.bind(console);
}
  

вызывается:

 this.logger.info('this is a log');
  

результат в пустой консоли:

Ответ №1:

Когда вы используете функцию, она просто возвращает ссылку на функцию, связанную с this ссылкой`, которую вы передали, когда вы вызываете ее в первый раз.

Итак, вам нужно снова вызвать возвращаемый объект функции с параметром. В качестве примера я сделал то же самое в приведенном ниже классе es6:

 class Test{
  info() {
     return console.info.bind(console);
  }
}
let test = new Test();
test.info()("test");  

Если это нужно сделать за один шаг, мы можем использовать либо call либо apply вместо bind. call or apply немедленно вызывает функцию, в отличие от bind, которая просто свяжет this ссылку и вернет связанную функцию.

Для использования call :

 info(){
   return console.info.call(console, ...arguments);
}
  

и apply :

 info(){
   return console.info.apply(console, arguments);
 }
  

С другой стороны, когда вы используете средство получения, доступ к свойству, подобному info , приведет к вызову средства получения и возврату ссылки на функцию, которую вы немедленно вызываете.

 class Test{
  get info() {
      return console.info.bind(console);
  }
}
let test = new Test();
test.info("test");  

 test.info -> returns the function reference
test.info("test") -> invokes the returned reference;
  

Ответ №2:

 public info() {
  return console.info.apply(console, arguments)
}
  

Этого будет достаточно.