【问题标题】:JS Declare Class & Instantiate For SingletonJS为单例声明类并实例化
【发布时间】:2020-12-10 19:20:15
【问题描述】:

我刚刚意识到您可以使用new 声明和构造一个类的新实例。这对于单例使用感觉非常优雅。这是有效的吗?如果是这样,有什么缺点吗?

var c = new class C {

    constructor () {
        this.foo = 'bar';
    }

}

console.log(c.foo);
console.log(c.constructor.name);
console.log(c.constructor.prototype);

编辑

console.log(C); // Uncaught ReferenceError: C is not defined

【问题讨论】:

  • 您不能实例化另一个C 类。控制台日志记录 c 给了我Uncaught ReferenceError: C is not defined。我还打算在模块export default new class C 中使用它,但这不是重点。
  • 嗯,但这里的问题不是您必须了解c 是否存在吗?单例模式的好处是您可以编写new Thing(),它会创建单例实例或将现有的单例实例交给您。
  • 技术上我可以console.log(new c.constructor()); 获得第二个实例。
  • @Nick 在我看来,单例应该是一个类的单个实例。 en.wikipedia.org/wiki/Singleton_pattern。因此,如果您不能重用C,那么作为单例可能就足够了。 @Taplar 确实在这方面戳了一个洞,因为从技术上讲,人们可以使用构造函数来创建另一个实例。

标签: javascript class singleton instance declare


【解决方案1】:

如果您的项目很小,Singleton 提供了很好的解决方案。但这个项目更大,更复杂。那么你的单例类将是混乱的。你很难在单例中追逐状态,来自某个地方的奇怪变量每天都在增加。

一个好主意是放弃类并使用函数式方式。提供函数所需的参数并递归传递下一个函数。像这样:

const main = () => {
  const setting = {...}
  const resultA = funcA(setting)
  funcB(setting, resultA)
  funcC(resultA)
}

这种方式有助于让我们知道需要设置什么功能。例如,funcAfuncB 需要 settingfuncC 不需要。更进一步,数据库实例或网络资源包含在其中,您可以详细控制各种效果!详情可通过“依赖注入”了解。

【讨论】:

  • 这个解决方案似乎更多的是关于项目设计的类与功能的观点。也许你可以用一个更好的例子来阐明你的观点?
猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 2013-04-21
  • 2014-01-26
  • 1970-01-01
相关资源
最近更新 更多