我可以像getter一样返回函数吗?

时间:2019-04-02 04:51:02

标签: 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');

空白控制台中的结果:

2 个答案:

答案 0 :(得分:1)

在使用函数时,它只是返回第一次调用时与传递的this引用绑定的函数引用。

因此,您需要再次使用参数调用返回的函数对象。例如,我在下面的es6类中做了相同的事情:

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

如果这需要一步完成,我们可以使用callapply代替绑定。与绑定不同,callapply立即调用该函数,而bind只是绑定this引用并返回绑定的函数。

使用call

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

apply

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

另一方面,当您使用 getter 时,访问info之类的属性将导致调用getter并返回要立即调用的函数引用。

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;

答案 1 :(得分:0)

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

可以。