Javascript 转换为单例

Javascript 转换为单例,javascript,jquery,Javascript,Jquery,我有下面的配置javascript,在这里我可以硬编码选择器div等,并设置一些属性,以便其他函数可以调用它来提供所需的值。我不想每次调用ex.config=new config()时都创建单独的实例,这不好。所以我以javascript闭包的形式修改了代码,不管创建多少次,它都只有一个实例 Config = function() { /** * Ids to external objects. * @public * @type object *

我有下面的配置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"
        }
}
转换为闭包
我喜欢做这样的事情

function MySingletonClass() {

  if ( arguments.callee._singletonInstance )
      return arguments.callee._singletonInstance;
  arguments.callee._singletonInstance = this;
   this.Foo = function() {
       // ...
   }
}

var a = new MySingletonClass()
var b = MySingletonClass()
Print( a === b ); // prints: true
我认为它应该易于实现和测试

从这里


希望这有帮助

您实际上并没有在那里创建闭包,您只是创建了一个函数并在原地执行它。Config正在存储来自该函数的返回

你要找的是一个更复杂的对象。你可以这样做:

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];
         }
     }
}());
在这里,getID和getTypes正在访问无法从外部修改或查看的变量,它们实际上是Config中唯一可用的方法

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

好的,所以如果你想存储对象而不是普通数据(字符串或数字),你必须尽可能长的存储这些对象才能被修改。IMHO最直接的方法是存储对象json编码并返回解码后的对象。如果这还不够好,您必须检查关于如何“克隆”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]);
    }
}
}());

我希望这有帮助

在您的情况下,您也可以编写
Config={id:{…},type:{…}为什么要使用函数?如上所述,只需定义一个数据结构即可。旁注:单例是有害的。拥有一个全球化的国家会让你的生活变得非常艰难,也会让你感到痛苦。测试依赖于隐藏在某处的全局代码的代码非常困难。相反,将该对象传递给执行引导的函数。(记住,)它仍然会将类的实例化限制为一个对象吗?不会。这会使包含在其中的信息变得可变。您可以从所有js文件的window.Config访问此信息。只需确保在所有依赖它的脚本之前先包含此代码即可。这意味着我不必执行config=new config();至少。只要把这段代码放在javascript的某个地方,之后的所有代码都可以访问它
(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]);
    }
}
}());