美文网首页
javascript设计模式读书笔记一单例模式

javascript设计模式读书笔记一单例模式

作者: 若邪Y | 来源:发表于2016-07-02 22:44 被阅读26次

    主要用的还是闭包的知识,以及重写构造函数,构造函数中返回值类型和引用类型的区别
    代码来自汤姆大叔的博客(深入理解JavaScript系列(25):设计模式之单例模式),阅读过程中我自己加上了一些注释

    1.包含私有成员和方法

    var mySingleton = function () 
    {
        /* 这里声明私有变量和方法 */
        var privateVariable = 'something private';
        function showPrivate() {
        console.log(privateVariable);
        }
        /* 公有变量和方法(可以访问私有变量和方法) */
        return {
                publicMethod: function () {
                showPrivate();
               },
                publicVar: 'the public can see this!'
         };
    };
    

    2.延迟初始化

    var Singleton = (function() {
        var instantiated;
        function init() {
            /*这里定义单例代码*/
            return {
                publicMethod: function() {
                    console.log('hello world');
                },
                publicProperty: 'test'
            };
        }
    
        return {
            getInstance: function() {
                if (!instantiated) {
                    instantiated = init();
                }
                return instantiated;
            }
        };
    })();
    
    /*调用公有的方法来获取实例:*/
    Singleton.getInstance().publicMethod();
    

    利用闭包的特性,判断instantiated实现延迟初始化

    3.最佳实践

    var SingletonTester = (function() {
    
        //参数:传递给单例的一个参数集合
        function Singleton(args) {
    
            //设置args变量为接收的参数或者为空(如果没有提供的话)
            var args = args || {};
            //设置name参数
            this.name = 'SingletonTester';
            //设置pointX的值
            this.pointX = args.pointX || 6; //从接收的参数里获取,或者设置为默认值
            //设置pointY的值
            this.pointY = args.pointY || 10;
    
        }
    
        //实例容器
        var instance;
    
        var _static = {
            name: 'SingletonTester',
    
            //获取实例的方法
            //返回Singleton的实例
            getInstance: function(args) {
                if (instance === undefined) {
                    instance = new Singleton(args);//最多只会new一次
                }
                return instance;
            }
        };
        return _static;
    })();
    
    var singletonTest = SingletonTester.getInstance({
        pointX: 5
    });
    console.log(singletonTest.pointX); // 输出 5 
    
    

    4.静态属性实现

    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
    

    5.重写构造函数

    function Universe() {
    
        // 缓存的实例
        var instance = this;
    
        // 其它内容
        this.start_time = 0;
        this.bang = "Big";
    
        // 重写构造函数
        Universe = function() {
            return instance;
        };
    }
    
    // 测试
    var uni = new Universe();//第一次new 后构造函数被重写,通过闭包引用第一次new产生的对象
    var uni2 = new Universe();
    uni.bang = "123";
    console.log(uni === uni2); // true
    console.log(uni2.bang); // 123
    
    

    6.

    function Universe() {
    
        // 缓存实例
        var instance;
    
        // 重新构造函数
        Universe = function Universe() {
            return instance;
        };
    
        // 后期处理原型属性(Universe已经被重写,通过闭包引用旧构造函数内的instance变量来实现单例)
        Universe.prototype = this;
    
        // 实例(构造函数已经被重写,第一次new的时候 instance还是值类型,返回的是新构造函数创建的
    对象,不是instance)
        instance = new Universe();
    
        // 重设构造函数指针(第一次new 构造函数指针还是正确的,但是第二次new instance已经是引用类型
    )
        console.log(instance.constructor===Universe);//true
        instance.constructor = Universe;
    
        // 其它功能
        instance.start_time = 0;
        instance.bang = "Big";
    
        return instance;
    }
    
    // 测试
    var uni = new Universe();
    var uni2 = new Universe();//两次new调用的构造函数不一样
    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
    
    

    7.闭包

    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
    
    

    相关文章

      网友评论

          本文标题:javascript设计模式读书笔记一单例模式

          本文链接:https://www.haomeiwen.com/subject/scvqjttx.html