单例和实例化实例的模块之间有什么区别



我想在代码中添加一个度量类。有什么区别

class MyMetrics {
constructor () {
if (!Singleton.instance) {
Singleton.instance = new Metrics()
}
return Singleton.instance
}
}
const metrics = new MyMetrics()

export const metrics = new Metrics()

导入metrics的每个模块不是都使用相同的Metrics实例吗?

它们在功能上与我的用法相同吗?推荐哪一个?

导入metrics的每个模块不是都使用相同的Metrics实例吗?

是的,他们会的。

它们在我的使用中功能相同吗?

只要A(您没有在模块中创建其他实例,B(您没有导出Metrics,是的,差不多。但需要记住的一点是,任何可以访问metrics导入的代码都可以通过metricsMetrics.prototype:继承的constructor属性间接访问Metrics构造函数

import { metrics } from "./your-module.js";
const newMetrics = new metrics.constructor();

您可能认为对于singleton,您已经避免了这种情况,但由于instance是公共的,这很容易被击败:

import { metrics } from "./your-module.js";
const Metrics = metrics.constructor;
Metrics.instance = null;
const newMetrics = new Metrics();

因此,您可能希望将其设为私有(可以使用静态私有属性,也可以仅使用metrics本身来检查您是否创建了它(。

推荐哪一种?

这是意见问题。但你可能根本不需要上课。你可以:

  • 只需直接生成一个对象,而不需要构造函数
  • 导出函数并关闭模块私有变量

例如,考虑一下这个(相当愚蠢的(类:

// stuff.js
class Stuff {
#items = new Map();
constructor() {
// ...pretend there's singleton logic here...
}
put(key, value) {
this.#items.set(key, value);
}
get(key) {
return this.#items.get(key);
}
}
export const stuff = new Stuff();

你使用的方式是:

import { stuff } from "./stuff.js";
stuff.put("this", "that");
stuff.get("this"); // "that"

你可以完全摆脱这个类:

// stuff.js
const items = new Map();
export const stuff = {
put(key, value) {
items.set(key, value);
},
get(key) {
return items.get(key);
}
};

用法相同:

import { stuff } from "./stuff.js";
stuff.put("this", "that");
stuff.get("this"); // "that"

或者您可以只导出putget:

// stuff.js
const items = new Map();
export const put = (key, value) => {
items.set(key, value);
};
export const get = (key) => items.get(key);

那么用法是:

import { get, put } from "./stuff.js";
put("this", "that");
get("this"); // "that"

或者,如果这些名称可能与其他内容冲突:

import { get as getStuff, put as putStuff } from "./stuff.js";
putStuff("this", "that");
getStuff("this"); // "that"

所以你有很多选择。如果您需要构造多个具有共享特性的对象,那么构造函数(包括使用class语法创建的构造函数(非常有用,但如果您没有这样做(并且您没有使用singleton(,那么直接编写对象或(使用模块(导出它可以直接做的事情可能是不错的选择。

最新更新