在这里介绍一种非常有用的类实例化技术 –惰性实例化。这种方法的原理就是:当需要使用到该类的时候才实例化它,而不是在脚本加载的时候将它实例化,加入内存里储存起来。这对于必须加载大量数据的单体的时候非常有用,在一定程度上能提高脚本的渲染速度。
首先我们来声明一个简单的单体:
[javascript]
var Single = (function(){
var website = "http://www.ilovejs.net";
var showWebsite = function(){
return website;
}
return {
website: website,
showWebsite: showWebsite
}
})();
[/javascript]
上面是一个简单的声明一个单体的模式,下面我们将它转化惰性实例化的方式:
[javascript]
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]
上面是我参照《Javascript设计模式》里的一段代码,下面我将它改造一下,加入Lazy Definition Pattern:
[javascript]
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());
[/javascript]
上面改造过后的单例会不会雅观多了呢。:) 上面使用的是单体来说明惰性实例化的过程,下面使用函数类的方式来说明一下:
[javascript]
var Single = (function(){
var unique = null;
function constructor(){
var website = "http://www.ilovejs.net";
var showWebsite = function(){
return website;
}
//返回一个类
return function(){
this.website = website;
this.showWebsite = showWebsite;
}
}
return {
getInstrance: function(){
if (unique) {
//show一下Lazy Definition Pattern
this.getInstrance = function(){
return unique;
}
return unique;
}
else {
//注意需要两个new的过程
unique = new new constructor();
return unique;
}
},
showWebsite: function(){
//可以直接调用showWebsite,而无需在调用方法的时候通过一个getInstrance的中间函数
return this.getInstrance().showWebsite();
}
}
})();
[/javascript]
使用类的方式则需要两个new的过程,这个看起来似乎不是很爽,可是加上Lazy Definition技巧,这个过程也就只需要执行一遍而已啦,在性能上也还是跟单体差不多的,就看是怎么去根据需求而应用不同的模式了。
当然了,如果看到两个new放在一起来实例化确实不爽,还是可以将另外一个new放到constructor函数里的:
[javascript]
function constructor(){
var website = "http://www.ilovejs.net";
var showWebsite = function(){
return website;
}
//返回一个实例化的实例对象
return new function(){
this.website = website;
this.showWebsite = showWebsite;
}
}
[/javascript]