【问题标题】:javascript singleton object per string每个字符串的javascript单例对象
【发布时间】:2011-06-29 06:36:53
【问题描述】:

我想创建一个每个字符串都是单例的对象。例如,当我调用myObject("string1") 时,它总是返回相同的对象,但与myObject("string2") 不同。

【问题讨论】:

  • 你想如何定义返回哪个对象?

标签: javascript oop singleton design-patterns


【解决方案1】:

我认为您想做这样的事情(按照您的 myObject(name) API 示例):

var myObject = (function (){
  var objects = {
    "myString1": {
      name: "myString One Object"
      //...
    },
    "myString2": {
      name: "myString Two Object"
      //...
    }
  };
  //...
  return function (name) { // the actual function
    return objects[name];  // that retrieves the object
  };                       // by its "name" (e.g. 'myString1')
})();


myObject("myString1").name;  // "myString One Object"
myObject("myString1") === myObject("myString1"); // true, the same object ref.
myObject("myString2").name;  // "myString Two Object"

【讨论】:

  • 字符串不应该是预定义的,我想对每个字符串都使用它。
【解决方案2】:

使用字符串作为属性创建一个对象并分配任何适合的值:

var myObject = {
  'string1': ... ,
  'string2': ... ,
  'string3': ... ,
   ...
};

然后通过字符串访问它们:

alert( myObject['string1'] ); // whatever

【讨论】:

    【解决方案3】:

    试试这个

    var MyObject = function(){
        var objs = {};
    
        return function(str){
            if( objs[str] ){
                return objs[str];
            }else{
                objs[str] = function(){
                    //some code here
                };
                return objs[str];
            }
        };
    }();
    

    【讨论】:

    • 它有效,但我不明白为什么作为私有对象的 objs 正在充当全局对象?为什么每次调用 MyObject 时 objs 都没有设置为新的 {} 对象?
    • 注意片段中的最后一个 ()。该函数将立即运行,而 MyObject 实际上是内部函数。 objs由内部函数中的引用持有,不会被破坏。在 javascript 中调用 clouser
    猜你喜欢
    • 2020-06-23
    • 2020-01-20
    • 2012-10-11
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多