如何从构造函数中调用全局变量
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 开发人员。
我的设置如下所示:
- 源/
- ActualCode(使用将创建
OtherClass
的功能)
- 测试/
- 模拟/
- 我的班级
- 其他类别 (
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
}
如果我删除周围的代码,它将(显然)起作用。
如何从 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 工作人员修复它。
我有一个 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 开发人员。
我的设置如下所示:
- 源/
- 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
}
如果我删除周围的代码,它将(显然)起作用。
如何从 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 工作人员修复它。