我有一个类,看起来是这样的:
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
}
}
有时这管用,有时不行。我不知道它什么时候起作用,什么时候不起作用,只知道它不是完全随机的。从同一个地方调用,构造函数要么工作,要么不工作。这无助于隔离问题。
当从一个没有直接的
我尝试了两个模块A和B.如果A定义了全局变量,那么即使没有
所以。。。我不知道这是怎么回事。可能是一个愚蠢的JavaScript噱头,我不是一个本地JavaScript开发人员。
我的设置如下所示:
当从
这意味着更改参数和添加
如何从类的构造函数调用全局变量?
当您将其全部放在一个文件中时,此示例代码将按预期工作:
$ 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's module-loading代码将按照遇到的顺序运行每一行。
您似乎需要一个单例:一个只有一个全局共享实例的类。请注意,单点模式通常被认为是一种反模式,并且应该被看作是您的系统耦合太紧的标志。
但是,这是您可以为您的用例实现它的方式(假设您使用node>=
class MyClass {...}
const instance = new MyClass();
export const getMyClassInstance = () => instance;
然后可以通过从其他模块导入和调用
import {getMyClassInstance} from './MyClass',
class OtherClass {
constructor(props) {
const MyObject = getMyClassInstance();
console.log(MyObject.field);
console.log(MyObject.method());
}
}
(只要您不导出