js單例模式


js實現單例模式

1.最簡單的方式

let SingleTest=(function () {
    let _instance = null;
    return function () {
        if(_instance==null){
            _instance=this;
        }
        return _instance;
    }
})();

let i1=new SingleTest();
let i2=new SingleTest();
console.log(i1===i2);  結果返回 true

2.如果要求加上參數

let SingleTest=(function () {
    let _instance = null;
    function _init(ops) {
        for(let i in ops){
            this[i]=ops[i];
        }
    }
    return function (args) {
        if(_instance==null){
            _instance=this;
        }
        _init.call(_instance,args);  如果是一個單純的函數,調用call方法需要將對象傳遞進去,這樣就相當於,實例方法了 return _instance;            但是這樣做有點不好看,可以使用 原型鏈將 _init函數變成實例方法
    }
})();

let i1=new SingleTest({name:"escapist1"});
let i2=new SingleTest({name:"escapist3"});
console.log(i1===i2);  結果是true
console.log(i1.name);  結果是escapist3

3.改進一下  不使用call方法來

let SingleTest=(function () {
    let _instance = null;
    SingleInstance.prototype._init=function (ops) {
        for(let i in ops){
            this[i]=ops[i];
        }
    };
    function SingleInstance(args) {
        if(_instance==null){
            _instance=this;
        }
        _instance._init(args);
        return _instance;
    }
    return SingleInstance;
})();

let i1=new SingleTest({name:"escapist1"});
let i2=new SingleTest({name:"escapist3"});
console.log(i1===i2);  結果是true
console.log(i1.name);  結果是escapist3

 4.如果給出的參數沒有就用默認值,有就用給出的let SingleTest = (function () {    let _instance = null;

let SingleTest = (function () {
let _instance = null;
let _default = {age: 25};
SingleInstance.prototype._init = function (ops) {
for(let j in _default){
this[j]=_default[j];
}
for (let i in ops) {
this[i] = ops[i];
}
};
function SingleInstance(args) {
if (_instance == null) {
_instance = this;
}
_instance._init(args);
return _instance;
}
return SingleInstance;
})();
let i1 = new SingleTest({name: "escapist1"}); 
let i2 = new SingleTest({name: "escapist3"});
console.log(i1 === i2); 結果是 true
console.log(i1.name);  結果是 escapist3
console.log(i1.age); 結果是 25

5.還有最后一個問題,有的人不適用new來創建對象,而是使用 let i1=SingleTest() 這樣來創建對象 

這種情況下,怎樣保證只有一個實let SingleTest = (function () {

let SingleTest = (function () {
    let _instance = null;
    let _default = {age: 25};
    SingleInstance.prototype._init = function (ops) {
        for (let a in _default) {
            this[a] = _default[a];
        }
        for (let b in ops) {
            this[b] = ops[b];
        }
    };
    function SingleInstance(args) {
        if (this instanceof SingleInstance) {
            if (_instance == null) {
                _instance = this;
            }
            _instance._init(args);
            return _instance;
        }else {
            if(_instance==null){
                _instance=new SingleInstance;
            }
        _instance._init(args);
return _instance; } } return SingleInstance; })(); let i1 = new SingleTest({name: "escapist1"}); let i2 = new SingleTest({name: "escapist3"}); let i3 = SingleTest({name: "escapist3"}); console.log(i1 === i2); 結果是true console.log(i1 === i3); 結果是true console.log(i1.name); 結果是escapist3 console.log(i1.age); 結果是2

至此js完整的單例模式改造完畢

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM