我在'帮助'中有一个名为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
上,我会收到此工具提示
而且,每当我将鼠标悬停在getSingleton()
上时,我都会收到此工具提示:
所以路径是正确的,但它仍然给我错误。
答案 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(...)
解析为其他内容,例如null
,null.getSingleton
不是函数。
此外,您无法在静态上下文中明确引用this
。 this
应仅用于类实例,而不是静态成员。
答案 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;