JS编程建议——70:惰性实例化

建议70:惰性实例化
惰性实例化要解决的问题是:避免了在页面中JavaScript初始化执行的时候就实例化类,如果在页面中没有使用这个实例化的对象,就会造成一定的内存浪费和性能消耗。如果将一些类的实例化推迟到需要使用它的时候才去做,就可以避免资源过早损耗,做到“按需供应”。
var myNamespace = function() {

var Configure = function() {
    var privateName = "someone's name";
    var privateReturnName = function() {
        return privateName;
    }
    var privateSetName = function(name) {
        privateName = name;
    }
    //返回单例对象
    return {
        setName : function(name) {
            privateSetName(name);
        },
        getName : function() {
            return privateReturnName();
        }
    }
}
//存储configure实例
var instance;
return {
    getInstance : function() {
        if(!instance) {
            instance = Configure();
        }
        return instance;
    }
}

}();
//使用方法上需要getInstance这个函数作为中间量
myNamespace.getInstance().getName();
上面就是简单的惰性实例化的示例,其中有一个缺点就是需要使用中间量来调用内部的Configure函数所返回的对象的方法,当然也可以使用变量来存储myNamespace.getInstance()返回的实例对象。将上面的代码稍微修改一下,就可以用比较直观的方法来使用内部的方法和属性。
//惰性实例化的变体
var myNamespace2 = function() {

var Configure = function() {
    var privateName = "someone's name";
    var privateReturnName = function() {
        return privateName;
    }
    var privateSetName = function(name) {
        privateName = name;
    }
    //返回单例对象
    return {
        setName : function(name) {
            privateSetName(name);
        },
        getName : function() {
            return privateReturnName();
        }
    }
}
//存储configure实例
var instance;
return {
    init : function() {
        //如果不存在实例,就创建单例实例
        if(!instance) {
            instance = Configure();
        }
        //创建Configure单例
        for(var key in instance) {
            if(instance.hasOwnProperty(key)) {
                this[key] = instance[key];
            }
        }
        this.init = null;
        return this;
    }
}

}();
//使用方式
myNamespace2.init();
myNamespace2.getName();
在上面代码中修改了自执行函数返回的对象的代码,在获取Configure函数返回的对象时,将该对象的方法赋给myNamespace2,这样调用方式就发生了一点改变。

时间: 2024-10-23 05:02:30

JS编程建议——70:惰性实例化的相关文章

JS编程建议——65:比较函数的惰性求值与非惰性求值

建议65:比较函数的惰性求值与非惰性求值在JavaScript中,使用函数式风格编程时,应该对于表达式有着深刻的理解,并能够主动使用表达式的连续运算来组织代码.1)在运算元中,除了JavaScript默认的数据类型外,函数也作为一个重要的运算元参与运算.2)在运算符中,除了JavaScript的大量预定义运算符外,函数还作为一个重要的运算符进行计算和组织代码.函数作为运算符参与运算,具有非惰性求值特性.非惰性求值行为自然会对整个程序产生一定的负面影响.先看下面这个示例:var a = 2;fun

JS编程建议——72:惰性载入函数

建议72:惰性载入函数惰性载入函数主要解决的问题也是兼容性,原理跟分支函数类似,下面是简单的示例.var addEvent = function(el, type, handle) { addEvent = el.addEventListener ? function(el, type, handle) { el.addEventListener(type, handle, false); } : function(el, type, handle) { el.attachEvent("on&q

JS编程建议——3:减少全局变量污染

建议3:减少全局变量污染定义全局变量有3种方式:在任何函数外面直接执行var语句. var f = 'value'; 直接添加一个属性到全局对象上.全局对象是所有全局变量的容器.在Web浏览器中,全局对象名为window. window.f = 'value'; 直接使用未经声明的变量,以这种方式定义的全局变量被称为隐式的全局变量. f = 'value'; 为方便初学者在使用前无须声明变量而有意设计了隐式的全局变量,然而不幸的是忘记声明变量成了一个非常普遍的现象.JavaScript的策略是让

JS编程建议——8:谨慎使用运算符(1)

建议8:谨慎使用运算符(1)1.用===,而不用==JavaScript有两组相等运算符:===和!==.==和!=.===和!==这一组运算符会按照期望的方式工作.如果两个运算数类型一致且拥有相同的值,那么===返回true,而!==返回false.==和!=只有在两个运算数类型一致时才会做出正确的判断,如果两个运算数是不同的类型,会试图强制转换运算数的类型.转换的规则复杂且难以记忆,具体规则如下: '' == '0' // false 0 == '' // true 0 == '0' //

JS编程建议——19:不要使用类型构造器

建议19:不要使用类型构造器在默认状态下,JavaScript预定义了很多构造函数,如Function().Array().Date().string()等,如果去掉小括号,它们就是JavaScript内置对象.在JavaScript中,构造函数实际上就是类的一种抽象结构.利用new运算符调用构造函数,可以快速生成很多实例对象.例如: var f = new Function(p1, p2, ..., pn, body); 其中构造函数Function()的参数类型都是字符串,p1-pn表示所创

JS编程建议——21:推荐提高循环性能的策略(1)

建议21:推荐提高循环性能的策略(1)每次运行循环体时都会产生性能开销,增加总的运行时间,即使是循环体中最快的代码,累计迭代上千次,也将带来不小的负担.因此,减少循环的迭代次数可获得显著的性能提升.例如: var iterations = Math.floor(items.length / 8), startAt = items.length % 8, i = 0; do { switch(startAt) { case 0: process(items[i++]); case 7: proce

JS编程建议——29:准确使用循环体(1)

建议29:准确使用循环体(1)1.选择正确的循环体在大多数编程语言中,代码执行时间多数消耗在循环的执行上.在一系列编程模式中,循环是最常用的模式之一,因此也是提高性能必须关注的地方之一.理解JavaScript 中循环对性能的影响至关重要,因为死循环或长时间运行的循环会严重影响用户体验.JavaScript定义了4种类型的循环:第一种循环是标准的for循环,与C语言使用同样的语法: for (var i=0; i < 10; i++){ //循环体 } for循环是最常用的循环结构,它由4部分组

JS编程建议——50:正确检测数组类型

建议50:正确检测数组类型由于数组和对象的数据同源性,导致在JavaScript编程中经常会出现:在必须使用数组时使用了对象,或者在必须使用对象时使用了数组.选用数组或对象的规则很简单:当属性名是小而连续的整数时,应该使用数组,或者当对属性的位置和排列顺序有要求时,应该使用数组.否则,使用对象.JavaScript语言对数组和对象的区别是混乱的.typeof运算符检测数组的类型是"object",这没有什么意义,因此在正确检测数组和对象方面JavaScript没有提供很多的机制.这时可

JS编程建议——59:推荐动态调用函数

建议59:推荐动态调用函数调用函数更便捷的方式是使用Function对象的call和apply方法.apply与call方法在本质上没有太大区别,只不过它们传递给函数的参数方式不同, apply是以数组形式进行参数传递,而call方法可以同时传递多个值.如果某个函数仅能够接收多个参数列表,而现在希望把一个数组的所有元素作为参数进行传递,那么使用apply方法就显得非常便利.function max(){ var m = Number.NEGATIVE_INFINITY; // 声明一个负无穷大的