首页 > 解决方案 > 如何从构造函数调用全局变量

问题描述

我有一个看起来像这样的类:

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 OtherClass {

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

有时这有效,有时无效。我不知道它什么时候起作用,什么时候不起作用,只是它不是完全随机的。从同一个地方调用,构造函数要么工作要么不工作。这无助于隔离问题。

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

我用两个模块 A 和 B 进行了尝试。如果 A 定义了全局变量,则 B 可以访问它们,即使没有 a require- 只要其他人拥有它。

所以......我很难过这是如何工作的。可能是一个愚蠢的 JavaScript 噱头,我不是原生 JavaScript 开发人员。

我的设置如下所示:

从and 调用时in 的构造函数OtherClass将能够访问,但不能从or调用。即使按顺序调用(因此全局变量确实存在)。MyClassMyClassOtherClassActualCodeActualCodeTest

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

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

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

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

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

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

标签: javascriptnode.jsmocha.js

解决方案


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

$ 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 的模块加载代码将按照遇到的顺序运行每一行。


推荐阅读