Javascript 对象/函数问题

标签 javascript functional-programming

我有一个日志记录类“logger”的实例,这个类有一个函数“log(txt)”,它可以工作。

现在我声明了一个不同的类“Runner”,并在构造函数中将记录器实例传递给它。一切正常,直到第 5 行,但第 7 行没有写入日志:

var Runner = function (logger) {
  // constructor:
  logger.log("this way it works");
  this.logger = logger; //line 4
  this.logger.log("this also works"); //line 5
  this.logf = this.logger.log; //create a shorthand for logging
  this.logf("this is not written to log. why? i thought i can create a var for a function"); //line 7
};

var logger = new Logger(); //class not shown here
var runner = new Runner(logger);
var otherinstancce = new OtherClass(logger) //line 12

你能解释一下我的错误是什么吗?

最佳答案

当您将 log 函数分配给当前对象的 logf 成员时,它就成为该当前对象的成员函数。当您调用 is 时,函数内部的 this 对象将引用它的新对象,而不是 this.logger 了。因此,该函数将找不到它想在记录器对象上调用的其他函数的变量。

为避免这种情况,您可以编写一个转发到记录器对象的简单函数:

this.log = function() { return this.logger.log(arguments); }

或者,使用闭包:

var obj = this.logger;
this.log = function() { return obj.log(arguments); }

关于Javascript 对象/函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218376/

相关文章:

functional-programming - Elm 中的值类型

python - 在 python 中迭代字符串并更改最后一位数字

javascript - 我可以将对象原型(prototype)保存在本地存储中吗?

javascript - Vuejs/javascript 计算购物车中的商品

JavaScript 'class' 和单例问题

javascript - CasperJS 测试文件中的测试套件循环导致 shell 中随机失败

javascript - IE11 将指针事件分流为触摸事件?

haskell - 关于Haskell中的控制流结构(多个if-then-else)

java - 范围管理 - 有状态 IO Monad?

scala - 在 Scala 中,通过名称参数调用的函数与将另一个函数作为参数的函数不同吗?