无法在ES6类上调用静态函数

时间:2017-10-31 15:53:22

标签: javascript class ecmascript-6 static

我在'帮助'中有一个名为helpers.js的文件。夹。内容如下:

class Helpers {
    constructor(config) {
        if (this._singleton) {
            throw new Error('A singleton has already been created.');
        }

        this._singleton = this;
    }

    /**
     * Gets the singleton object.
     * @returns {Helpers}
     */
    static getSingleton() {
        return this._singleton;
    }
}

module.exports = Helpers;

然后在/helpers/user.js我希望获得帮助者的单例实例。 这是我的代码:

const helpers  = require('../helpers').getSingleton();

const Helpers  = require('../helpers');
const helpers  = Helpers.getSingleton();

我不断得到的错误是:

TypeError: require(...).getSingleton is not a function

TypeError: Helpers.getSingleton is not a function

如果我将鼠标悬停在VSCode中的Helpers上,我会收到此工具提示

Helpers Tooltip

而且,每当我将鼠标悬停在getSingleton()上时,我都会收到此工具提示:

getSingleton() tooltip

所以路径是正确的,但它仍然给我错误。

3 个答案:

答案 0 :(得分:3)

在JavaScript中实现单例模式的最简单方法是根本不导出类,例如。

class Helpers {}

let helper;
module.exports = function() {
   if (!helper) helpers = new Helpers();
   return helper;
};

// loaded with
var helpers = require('../helpers')(); // note the extra () to call it

甚至更好,因为我们不仅限于类似Java的行为,只需完全跳过该函数并执行

class Helpers {}
module.exports = new Helpers();

// loaded with
var helpers = require('../helpers');

然后如果您的所有模块都是导出的是一个类的单个实例,那么首先使用类的理由很少。你也可以这样做

exports.helperMethodOne = function(){};
exports.helperMethodTwo = function(){};
exports.helperMethodThree = function(){};

// loaded with
var helpers = require('../helpers');

module.exports = {
  helperMethodOne() {},
  helperMethodTwo() {},
  helperMethodThree() {},
};

// loaded with
var helpers = require('../helpers');

答案 1 :(得分:0)

您的require语句错误,但很难在不了解您的环境的情况下准确地告诉您正确的语法。

const config = require('/path/to/file');

很典型。所以试试:

const Helpers = require('../helpers');

您在屏幕截图中写了'../helpers.js',而不是'../helpers'

您收到错误:

  

TypeError:require(...)。getSingleton不是函数

因为require(...)解析为其他内容,例如nullnull.getSingleton不是函数。

此外,您无法在静态上下文中明确引用thisthis应仅用于类实例,而不是静态成员。

答案 2 :(得分:0)

您可以执行以下操作,将其用作Singleton.getInstance();

class Singleton {
    static instance = new Singleton();
    static getInstance = () => Singleton.instance;

    constructor() {
        throw new Error('Use Singleton.getInstance()');
    }
}

module.exports = Singleton;

甚至更冒险,并将其用作new Singleton()

class Singleton {
    static instance;
    constructor() {
        if (!Singleton.instance) {
            Singleton.instance = this;
        }
        return Singleton.instance;
    }
}

module.exports = Singleton;