惰性实例化
在这里介绍一种非常有用的类实例化技术 –惰性实例化。这种方法的原理就是:当需要使用到该类的时候才实例化它,而不是在脚本加载的时候将它实例化,加入内存里储存起来。这对于必须加载大量数据的单体的时候非常有用,在一定程度上能提高脚本的渲染速度。
首先我们来声明一个简单的单体:
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());
上面改造过后的单例会不会雅观多了呢。:) 上面使用的是单体来说明惰性实例化的过程,下面使用函数类的方式来说明一下:
(全文…)