问题是如何从NodeJS模块导出的类的静态方法引用其他静态方法?这是一个设置。我有以下模块:test1.js
var Parent = class {
static smethod1 () {
return this.smethod2();
}
static smethod2 () {
return "Testing tube";
}
}
module.exports = {
Parent:Parent
}
然后我test2.js
require
这个模块
var mod = require('./test1');
var Parent = mod.Parent;
module.exports = {
sm1: Parent.smethod1,
sm2: Parent.smethod2
}
最后,我有一个在run.js
var test2 = require('./test2');
console.log(test2.sm1());
当然,我希望看到"Testing tube"
行打印出来。我收到错误
return this.smethod2();
^
TypeError: this.smethod2 is not a function
当然,在NodeJS上有一些恶作剧,其中this
指的是一个模块,但它不应该指代一个函数吗?有没有办法从smethod2
引用当前设置的静态方法smethod1
?如果没有,有哪些解决方法?
答案 0 :(得分:2)
this
关键字在JavaScript中有点奇怪,并不总是像大多数基于类的语言一样引用您的实例。在您的情况下,当您致电test2.sm1()
时,this
设置为test2
对象,即
{
sm1: Parent.smethod1,
sm2: Parent.smethod2
}
该对象没有smethod2
函数。
this
根据JavaScript中调用函数的方式设置,特别是“.
”之前的任何内容:->test2<-.sm1()
。
有几种解决方法。首先,在定义Parent
类之后,您可以将该函数的this
绑定到类:
var Parent = class {
static smethod1 () {
return this.smethod2();
}
static smethod2 () {
return "Testing tube";
}
}
// bind `this` to `Parent`
Parent.smethod1 = Parent.smethod1.bind(Parent);
module.exports = {
Parent:Parent
}
或者,您可以将Parent
作为参数传递给call
或apply
,它会为这一次调用手动设置this
:
var Parent = require('./test1');
var test2 = require('./test2');
// call `test2.sm1` with a context of `Parent`
console.log(test2.sm1().call(Parent));