引用从Node JS模块

时间:2017-02-28 04:04:40

标签: javascript node.js ecmascript-6

问题是如何从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?如果没有,有哪些解决方法?

1 个答案:

答案 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作为参数传递给callapply,它会为这一次调用手动设置this

var Parent = require('./test1');
var test2 = require('./test2');

// call `test2.sm1` with a context of `Parent`    
console.log(test2.sm1().call(Parent));