javascript - 转换为单例

标签 javascript jquery

我有以下配置 JavaScript,我可以在其中对选择器 div 等进行硬编码并设置一些属性,以便其他函数可以调用它来提供所需的值。我不想每次调用 ex 时都创建单独的实例。 config = new Config() 这不好。所以我以javascript闭包的形式更改了代码,是不是无论创建多少次都只有一个实例?

Config = function() {
    /**
     * Ids to external objects.
     * @public
     * @type object
     */
    this.ids = {
        objec1: "whiteboard",
        text1: "dialogInputText",
        image1: "dialogInputImage",
        icons: "dialogIcons",
        size: "dialogResize"
    };
    /**
     * Paper Type
     * @public
     * @type property
     */
    this.types = {
            store: "TSC",


            document: "Document"
        }
}

转换为闭包

Config = (function(){
result = {        /**
         * Ids to external objects.
         * @public
         * @type object
         */
        ids: {
            objec1: "whiteboard",
            text1: "dialogInputText",
            image1: "dialogInputImage",
            icons: "dialogIcons",
            size: "dialogResize"
        },
        /**
         * Paper Type
         * @public
         * @type property
         */
        types: {
                store: "TSC", 
                document: "Document"
            }



})()

最佳答案

你实际上并没有在那里创建一个闭包,你只是创建一个函数并就地执行它。配置正在存储该函数的返回结果。

您正在寻找的是一个更复杂的对象。你可以这样做:

Config = (function() {
    var ids = {
        objec1: "whiteboard",
        text1: "dialogInputText",
        image1: "dialogInputImage",
        icons: "dialogIcons",
        size: "dialogResize"
        },
        types = {
            store: "TSC",
            document: "Document"
        }
     return {
         getIDs: function (id) {
             return ids[id];
         },
         getTypes: function (type) {
             return types[type];
         }
     }
}());

这里,getIDs 和 getTypes 正在访问无法修改或从外部查看的变量,实际上是 Config 中唯一可用的方法。

(function(){}()) 大致相当于 function name(){} name(),虽然语法很困惑,但你所做的实际上是声明一个匿名(未命名)函数并尽快执行它正如它所声明的那样(您无法以其他方式执行此操作,因为它没有任何名称)。计算该表达式的结果是执行该函数的结果。但请注意,第一个表达式不会在更大的范围内引入任何新变量(这是使用此构造的主要原因),而另一个声明则会引入任何新变量。

好吧,如果您想存储对象而不是普通数据(字符串或数字),则必须花费大量精力才能使这些对象不可修改。恕我直言,最直接的方法是存储编码的对象 json 并返回解码后的对象。如果这还不够好,您将不得不检查有关如何“克隆” javascript 对象的其他答案,您可以检查此问题 What is the most efficient way to deep clone an object in JavaScript?

因此,通过使用 JSON,匿名函数将变成这样

(function () {
    var ids = {
       object1: '{"whiteboard":"an object\'s property"}',
       text1: '["an","array"]'
      },
     ...
return {
    getIDs: function (id) {
         return JSON.parse(ids[id]);
    },
    getTypes: function (type) {
         return JSON.parse(types[type]);
    }
}
}());

希望这有帮助

关于javascript - 转换为单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17328499/

相关文章:

javascript - Node.js https.get.on ("error",函数(e){...} 不工作

javascript - 图片未出现在应用程序的 "release version"中

javascript - 如何让 jQuery 从外部 TXT 文件读取 "Regular Expressions"

jquery - 带有 jquery 和重音字符的正则表达式

javascript - 谷歌使用的滚动条

javascript - webdriver node js在类标签下获取多个链接

javascript - KO 引用错误 : Unable to process binding

javascript - 验证 javascript/jquery 中的 url 格式

javascript - 尝试使用带有多个提交按钮的jquery提交表单

c# - 如何使用 __doPostBack()