惰性实例化

在这里介绍一种非常有用的类实例化技术 –惰性实例化。这种方法的原理就是:当需要使用到该类的时候才实例化它,而不是在脚本加载的时候将它实例化,加入内存里储存起来。这对于必须加载大量数据的单体的时候非常有用,在一定程度上能提高脚本的渲染速度。

首先我们来声明一个简单的单体:

var Single = (function(){
    var website = "http://www.ilovejs.net";
    var showWebsite = function(){
        return website;
    }
    return {
        website: website,
        showWebsite: showWebsite
    }
})();

上面是一个简单的声明一个单体的模式,下面我们将它转化惰性实例化的方式:

var Single = (function(){
    //声明一个unique变量来判断是否已经实例化
    var unique = null;
    //将上面的单体都放入到一个constructor函数里
    function constructor(){
        var website = "http://www.ilovejs.net";
        var showWebsite = function(){
            return website;
        }
        return {
            website: website,
            showWebsite: showWebsite
        }
    }
    return {
        getInstrance: function(){
            //这是实现惰性实例化的关键,判断是否已经实例化
            //当下次调用getInstrance的时候就可以直接使用unique内储存的单体对象
            //这也从而实现了只实例化一次的作用
            if (unique) { return unique; }
            else {
               unique=constructor();
               return unique;
            }
        }
    }
})();

//使用方式:
alert(Single.getInstrance().showWebsite());

上面是我参照《Javascript设计模式》里的一段代码,下面我将它改造一下,加入Lazy Definition Pattern:

var Single = (function(){
    var unique = null;
    function constructor(){
        var website = "http://www.ilovejs.net";
        var showWebsite = function(){
            return website;
        }
        return {
            website: website,
            showWebsite: showWebsite
        }
    }
    return {
        getInstrance: function(){
            if (unique) {
                //show一下Lazy Definition Pattern
                this.getInstrance = function(){
                    return unique;
                }
                return unique;
            }
            else {
                unique=constructor();
                return unique;
            }
        },
        showWebsite: function(){
            //可以直接调用showWebsite,而无需在调用方法的时候通过一个getInstrance的中间函数
            return this.getInstrance().showWebsite();
        }
    }
})();

//使用方式:
alert(Single.showWebsite());

上面改造过后的单例会不会雅观多了呢。:) 上面使用的是单体来说明惰性实例化的过程,下面使用函数类的方式来说明一下:
(全文…)