javascript 单例需要双括号吗?

问题描述 投票:0回答:1
  • 我为我的 Google Sheet 创建了一个类似单例的函数;
  • Priv
    Pub
    是我模拟私人和公共的方式;
  • 当我将其实例分配给变量时,我需要输入
    ()()
    ,以便它按照我想要的方式工作。我希望能够输入
    Priv.whateverProp
  • 我已经在 Singleton 函数内的其他地方尝试过使用双括号,但是当我只使用一个
    ()
    时,完成结果会显示
    apply, bind, call etc
  • 然后我必须再次
    getInstance()()
    .completions**
    才能访问实例属性,但是当我运行程序时,它显示
    SingletonFinder().getInstance() is not a function
  • 所以我必须将 getInstance() 保留为单括号,并为其余代码输入
    Priv().whaterverProp
    而不是
    Priv.whateverProp
    ,这是我不想要的。
  • 为什么我必须这样输入
    let Priv = SingletonFinder().getInstance()()
function GetFinder(){
    let Pub = {}
    let Priv = SingletonFinder().getInstance()()
    // the rest of the code...
}

function SingletonFinder() {
    let Priv = {}
    let Pub = {}

    /** @type {Class_Finder} */
    Priv.instance = null;
    Priv.createInstance = function () {
        return Class_Finder
    }
    Pub.getInstance = function () {
        if(!Priv.instance) {
            Priv.instance = Priv.createInstance()
        }
        return Priv.instance
    };
    return Pub
}

function Class_Finder() {
    // properties
}
javascript design-patterns singleton
1个回答
-1
投票

多年后,在回顾这个项目后,我可以得出这样的结论:

  • 利用Javascript的闭包来管理对值和函数的访问是更聪明的做法;这段代码背后的逻辑导致它在不需要的时候变得冗长;
  • 正如所指出的,我未能在给定的示例中重现单例模式的正确结构,因为它无法确保全局范围内有一个类的单个实例;
  • 正如所指出的,
    SingletonFinder().getInstance()()
    中需要额外的括号是由于
    getInstance
    的返回值,即
    Class_Finder
    函数;以下代码举例说明了为什么需要
    ()()
    才能输出“true”:
const obj = {};
const fn = ()=>{return true}
obj.method = ()=>{return fn}

console.log(obj.method) //output: function
console.log(obj.method()) //output: function
console.log(obj.method()()) //output: true

最后,一切都是为了好玩!我从来都不是一名职业程序员,只是一个完全的初学者。当时,模式让我着迷,就像尝试编码和浏览在线社区一样。

© www.soinside.com 2019 - 2024. All rights reserved.