如何从构造函数中调用全局变量

How to Call Global Variables From Constructors

我有一个 class 看起来像这样:

class MyClass {

    constructor() {
        this.field = 42;
    }
    
    method() {
        return "Hello world!";
    }
}

我想将它的一个实例定义为一个全局变量,所以我注册了它:

global.MyObject= new MyClass();

这意味着这现在可以工作了:

console.log(MyObject.field); // 42
console.log(MyObject.method()); // Hello world!

然而,每当我从另一个 class 调用相同的代码时,它突然变得更加随机:

class OtherClass {

    constructor() {
        console.log(MyObject.field); // undefined
        console.log(MyObject.method()); // TypeError: MyObject.method is not a function
    }
}

有时这行得通,有时行不通。我无法确定它何时有效,何时无效,只是它不是完全随机的。从同一个地方调用,构造函数要么工作要么不工作。这无助于隔离问题。

似乎当 class 的构造函数从没有直接 require('my-class') 的模块调用时它不会工作 - 即使 OtherClass 有那个要求?即使每个其他模块都有 require?这没有任何意义。

我用两个模块 A 和 B 试过。如果 A 定义了全局变量,即使没有 require B 也可以很好地访问它们 - 只要其他人有它。

所以...我对它的工作原理感到困惑。可能是个愚蠢的 JavaScript 噱头,我不是本地 JavaScript 开发人员。

我的设置如下所示:

OtherClass 中的构造函数在从 MyClassOtherClass 调用时将能够访问 MyClass,但不能从 ActualCodeActualCodeTest.即使按顺序调用(所以全局变量肯定存在)。

这意味着更改参数并添加 require 是不可能的,因为 ActualCode 永远不会知道测试代码。

问题似乎出在 Mocha 框架上。无法在“it”内部访问全局变量:

console.log(MyObject.field); // 42

it('test', () => {
    console.log(MyObject.field); // undefined
}

如果我删除周围的代码,它将(显然)起作用。

如何从 class 的构造函数中调用全局变量?

当您将所有代码都放在一个文件中时,此示例代码可以按预期工作:

$ cat sample.js 
class MyClass {
    constructor() {
        this.field = 42;
    }

    method() {
        return "Hello world!";
    }
}
global.MyObject = new MyClass();

class OtherClass {
    constructor(props) {
        console.log(MyObject.field);
        console.log(MyObject.method());
    }
}

new OtherClass();
$ node sample
42
Hello world!

我怀疑在加载模块时这些行的顺序是 运行 造成的混乱。 Node 的模块加载代码将 运行 遇到序列中的每一行。

问题是 Mocha 无法在其测试中访问全局变量。我找不到 此行为的相关错误,但至少 person with the same problem.

由于全局变量只在测试中使用,所以我有一个简单的解决方案:

global.MyObject= new MyClass();

module.exports.MyObject = MyObject;

测试中的这个:

before(() => {
    global.MyObject = require('./mock/my-class').MyObject;
});

添加一个 TODO 可能是个好主意,这样您就可以不时地重新访问这个问题,以防 Mocha 工作人员修复它。