我有一个日志记录类“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/