深入理解JavaScript系列(25):设计模式之单例模(2)

//获取实例的方法
        //返回Singleton的实例
        getInstance: function (args) {
            if (instance === undefined) {
                instance = new Singleton(args);
            }
            return instance;
        }
    };
    return _static;
})();

var singletonTest = SingletonTester.getInstance({ pointX: 5 });
console.log(singletonTest.pointX); // 输出 5

其它实现方式

方法1:

复制代码 代码如下:


function Universe() {

// 判断是否存在实例
    if (typeof Universe.instance === 'object') {
        return Universe.instance;
    }

// 其它内容
    this.start_time = 0;
    this.bang = "Big";

// 缓存
    Universe.instance = this;

// 隐式返回this
}

// 测试
var uni = new Universe();
var uni2 = new Universe();
console.log(uni === uni2); // true

方法2:

复制代码 代码如下:


function Universe() {

// 缓存的实例
    var instance = this;

// 其它内容
    this.start_time = 0;
    this.bang = "Big";

// 重写构造函数
    Universe = function () {
        return instance;
    };
}

// 测试
var uni = new Universe();
var uni2 = new Universe();
uni.bang = "123";
console.log(uni === uni2); // true
console.log(uni2.bang); // 123

方法3:

复制代码 代码如下:


function Universe() {

// 缓存实例
    var instance;

// 重新构造函数
    Universe = function Universe() {
        return instance;
    };

// 后期处理原型属性
    Universe.prototype = this;

// 实例
    instance = new Universe();

// 重设构造函数指针
    instance.constructor = Universe;

// 其它功能
    instance.start_time = 0;
    instance.bang = "Big";

return instance;
}


// 测试
var uni = new Universe();
var uni2 = new Universe();
console.log(uni === uni2); // true

// 添加原型属性
Universe.prototype.nothing = true;

var uni = new Universe();

Universe.prototype.everything = true;

var uni2 = new Universe();

console.log(uni.nothing); // true
console.log(uni2.nothing); // true
console.log(uni.everything); // true
console.log(uni2.everything); // true
console.log(uni.constructor === Universe); // true

方式4:

复制代码 代码如下:


var Universe;

(function () {

var instance;

Universe = function Universe() {

if (instance) {
            return instance;
        }

instance = this;

// 其它内容
        this.start_time = 0;
        this.bang = "Big";
    };
} ());

//测试代码
var a = new Universe();
var b = new Universe();
alert(a === b); // true
a.bang = "123";
alert(b.bang); // 123

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgfdwz.html