【发布时间】:2021-01-10 14:52:39
【问题描述】:
我有一个如下所示的课程:
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 定义了全局变量,即使没有 require,B 也可以正常访问它们——只要其他人拥有它。
所以...我对它的工作原理感到困惑。可能是一个愚蠢的 JavaScript 噱头,我不是原生 JavaScript 开发人员。
我的设置如下所示:
- 源/
- ActualCode(使用将创建
OtherClass的功能)
- ActualCode(使用将创建
- 测试/
- 模拟/
- 我的班级
- 其他类 (
require('MyClass'))
- ActualCodeTest (
require('ActualCode'),require('OtherClass')
- 模拟/
OtherClass 中的构造函数在从MyClass 和OtherClass 调用时将能够访问MyClass,但不能从ActualCode 或ActualCodeTest 调用。即使按顺序调用(因此全局变量确实存在)。
这意味着更改参数和添加require 是不可能的,因为ActualCode 永远不应该知道测试代码。
问题似乎出在 Mocha 框架上。全局变量不能在“it”内部访问:
console.log(MyObject.field); // 42
it('test', () => {
console.log(MyObject.field); // undefined
}
如果我删除周围的代码,它将(显然)工作。
如何从类的构造函数中调用全局变量?
【问题讨论】:
-
global是什么?是这个节点吗?如果是这样,为了使您的代码更便携,您可以考虑改用globalThis。然后你会做globalThis.MyObject.field.. 但我个人无论如何都不会这样做全局变量,而是使用模块。 -
不要使用全局变量。但是,如果你真的,真的想破坏你的程序安全并让它难以推理,
globals是什么——你在 NodeJS 上吗?如果是这样,请将其标记为这样。如果类构造函数依赖于一条数据,为什么不使用参数呢? -
@ggorlen 我的代码针对(和内部)一个复杂的 JavaScript 应用程序(不是我的)运行。为了测试这段代码,我正在创建模拟代码。由于“复杂的 JavaScript 应用程序”使用全局变量,我的模拟也需要这样做。因此,使用参数是不可能的,任何不会将该字段放入
MyObject.field的东西也是如此。 -
提供上下文很好,谢谢,但我怀疑访问是否有效。如果没有minimal reproducible example,除了推测发生了什么之外,很难做更多的事情。
标签: javascript node.js mocha.js