提问者:小点点

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


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

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定义了全局变量,那么即使没有,B也可以很好地访问它们--只要其他人有它。

所以。。。我不知道这是怎么回事。可能是一个愚蠢的JavaScript噱头,我不是一个本地JavaScript开发人员。

我的设置如下所示:

    的功能

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

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

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


共2个答案

匿名用户

当您将其全部放在一个文件中时,此示例代码将按预期工作:

$ 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>=作为ES6语法)

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());
    }
}

(只要您不导出,您就可以认为它是一个单例,但是从您的问题来看,并不完全清楚模块如何加载以及如何相互关联。根据您的配置,您可能需要将封装在私有构造函数中,以便使它严格地成为一个。)