0

I have the following config javascript, where i can hardcode the selectors divs etc and set few attributes so it can be invoked by other functions to provide the needed values. I don't want to create seperate instance everytime i invoke ex. config = new Config() which is not good. So i have changed the code in the form of javascript closures, is that will have only one instance no matter how many times it is created?

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"
        }
}

Convert to closure

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"
            }



})()
4

2 回答 2

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(){}()) 大致等价于 function name(){} name(),虽然语法比较混乱,但实际上你所做的就是声明一个匿名(未命名)函数并在它出现后立即执行声明(你不能以其他方式做,因为它没有任何名字)。评估该表达式的结果是执行该函数的结果。但是请注意,第一个表达式不会在更大范围内引入任何新变量(这是使用此构造的主要原因),而另一个声明会。

好的,所以如果您想存储对象而不是普通数据(字符串或数字),您将不得不竭尽全力以使这些对象不可修改。恕我直言,最直接的方法是存储对象 json 编码并返回它们解码。如果这还不够好,您将不得不检查有关如何“克隆”javascript 对象的另一个答案,您可以检查这个问题What is the most effective 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]);
    }
}
}());

我希望这有帮助

于 2013-06-26T19:14:18.027 回答
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

希望这可以帮助。

于 2013-06-26T19:12:33.037 回答