转换为单身

时间:2013-06-26 19:09:02

标签: 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"
            }



})()

2 个答案:

答案 0 :(得分:1)

我喜欢这样做......

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

我认为应该很容易实现和测试。

从这里...... https://code.google.com/p/jslibs/wiki/JavascriptTips#Singleton_pattern

希望这会有所帮助。

答案 1 :(得分:1)

你还没有在那里创建一个闭包,你只是创建一个函数并在原地执行它。 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];
         }
     }
}());

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

(function(){}())大致等同于函数名(){} name(),虽然语法令人困惑,但你所做的实际上是声明一个匿名(未命名)函数并尽快执行它因为它被声明(你不能以另一种方式做,因为它没有任何名字)。评估该表达式的结果是执行该函数的结果。但是请注意,第一个表达式不会在较大的范围内引入任何新变量(这是使用此结构的主要原因),而另一个声明将使用。

好的,所以如果你想存储对象而不是普通数据(字符串或数字),你必须付出很大的代价才能使这些对象不可修改。 IMHO最直接的方式是存储对象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]);
    }
}
}());

我希望这会有所帮助