var Demo = (function() {
var uniqueInstance = null;
function klass(){this.init.apply(this, arguments)}
return {
getInstance: function(){
if (!uniqueInstance) // Instantiate only if the instance doesn't exist. 
uniqueInstance = new klass();
return uniqueInstance;
}
}
})();
各位大神,我模拟singleton的写法初始化的时候怎么传参数啊?

解决方案 »

  1.   

    我想实现这种调用Demo.getInstance("a1","a2")
      

  2.   


    试试这样
    var Demo = (function(a1,a2) {
        var aa=a1,bb=a2;
        var uniqueInstance = null;
        function klass(){this.init.apply(this, arguments)}
        return {
            getInstance: function(){
                alert(aa);
                /*if (!uniqueInstance) // Instantiate only if the instance doesn't exist. 
                    uniqueInstance = new klass();
                return uniqueInstance;*/
            }
        }
    })("a1","a2");
    Demo.getInstance();--------------------------------------------
    var Demo = (function(a1,a2) {
        var aa=a1,bb=a2;
        var uniqueInstance = null;
        function klass(){this.init.apply(this, arguments)}
        return {
            getInstance: function(){
                //这里直接可以用Demo函数中的变量,用到闭包
                if (!uniqueInstance) // Instantiate only if the instance doesn't exist. 
                    uniqueInstance = new klass();
                return uniqueInstance;
            }
        }
    })("a1","a2");
    alert(Demo())//返回一个对象
      

  3.   

    var Demo = (function() {
        var uniqueInstance = null;
        function klass(){this.init.apply(this, arguments)}
        return {
            getInstance: function(){
                var args = arguments;
                for(var i=0;i<args.length;i++){
                     alert(args[i]);
                 }
                if (!uniqueInstance) // Instantiate only if the instance doesn't exist. 
                    uniqueInstance = new klass();
                return uniqueInstance;
            }
        }
    })();alert(Demo('v1','v2'));
      

  4.   

    我主要的目的是在初始调用不定的参数传给this.init这个constructor函数执行。
    我的疑惑是怎么传入最合理? if (!uniqueInstance){ // Instantiate only if the instance doesn't exist. 
         klass.apply(this,arguments)-->这样传过去是不对的
         uniqueInstance = new klass();
    }
     return uniqueInstance;
      

  5.   

    var Demo = (function() {
        var args = arguments;
        var uniqueInstance = null;
        function klass(){this.init.apply(this, arguments)}
        return {
            getInstance: function(){
                
                for(var i=0;i<this.args.length;i++){
                     alert(this.args[i]);
                 }
                if (!uniqueInstance) // Instantiate only if the instance doesn't exist. 
                    uniqueInstance = new klass();
                return uniqueInstance;
            }
        }
    })();alert(Demo('v1','v2'));
      

  6.   

    var Demo = (function(a1,a2) {})('v1','v2');//这样就可以传过去了,匿名函数传参
      

  7.   


    var Class = (function(){
        function create(options){
            var options = options || {}, uniqueInstance = null;
            //判定是否需要实现单例
            var singleton = !!options.singleton;
            function klass(){
                if (!singleton) 
                    this.init.apply(this, arguments);
            }
            //处理函数:如果singleton模式,则private constructor
            return singleton ? {
                getInstance: function(){
                    if (!uniqueInstance) {// Instantiate only if the instance doesn't exist.
                        uniqueInstance = new klass;
                        uniqueInstance.init.apply(uniqueInstance, arguments);
                    }
                    return uniqueInstance;
                }
            } : klass;
        }
        return {
            create: create
        };
    })()
    var Animal = Class.create({
        init: function(name, sound){
            this.name = name;
            this.sound = sound;
        },
        speak: function(){
            alert(this.name + " says: " + this.sound + "!");
        },
    singleton:true
    });Animal.getInstance("xx","xxx"....[任意参数]).speak() -->得到一个对象上面代码我用了个对于代码
    uniqueInstance.init.apply(uniqueInstance, arguments);来执行实例化的时候初始化,这样很自我感觉很恶心的代码,怎么该?
      

  8.   

    我的问题不是传参数进去,而是在singleton模式下如何传参数给构造函数执[init]行初始化对象
      

  9.   

    当然非singleton下这样使用
    var con = new Animal(参数1,。)
      

  10.   

      function klass(){this.init.call(this,{
                 initP1:'v1',
                 initP2:'v2'     })}
      

  11.   

    tidelgl,你好,你的这种写法是实际的写法,而不能用来处理不定的参数,不能当作类生成器的代码,我可能没理解到你的意思,惭愧。
      

  12.   

    我完整的代码在
    http://www.cnblogs.com/z-lib/archive/2010/07/29/1788296.html