在Javascript的OOP编程过程中,构造函数的声明方式和编写都是必须的,下面是我所能想到的五种构造函数的声明方式,现在就让我们来测试一下它们实例化的性能比较有什么差别(当然了,下面的只是一些简单的构造函数,对于庞大的构造函数的话,性能的差异也就更加明显了)。
第一种方式:就是我们普通都会使用的方式了,在构造函数内声明属性,在函数为通过prototype声明方法
[javascript]
var Class3 = function(){
this.website = "http://www.ilovejs.net";
}
Class3.prototype = {
showSite: function(){
alert(this.website);
}
}
[/javascript]
第二种方式:是将方法和函数都声明在构造函数内,这种方式目前不太提倡使用,因为每次构造函数实例化的时候都会生成一个不同的showSite方法
[javascript]
var Class1 = function(){
this.website = "http://www.ilvoejs.net";
this.showSite = function(){
alert(this.website);
}
}
[/javascript]
第三种方式:构造函数为空的声明方式,将属性和方法都声明在构造函数的外部,经过测试,这种方式的性能是最好的,因为它的构造函数基本没有什么操作,所以实例化的速度是最快的。
[javascript]
var Class2 = function(){
};
Class2.prototype = {
website: "http://www.ilovejs.net",
showSite: function(){
alert(this.website);
}
}
[/javascript]
第四种方式:在构造函数内部返回一个对象,这样的方式可以说不是“构造函数”,因为它没有使用new关键字来实例类,而是当作一个方法来调用了
[javascript]
var Class4 = function(){
var website = "http://www.ilovejs.net";
var showSite = function(){
alert(website);
}
return {
website: website,
showSite: showSite
}
}
[/javascript]
第五种方式:在构造函数内返回一个匿名函数的实例化对象,这种方式跟第四种方式是比较类似的,都不是真正意义上的“构造函数”,都是当作一个函数来调用,只是在函数内实现了匿名函数的实例化过程。
[javascript]
var Class5 = function(){
var website = "http://www.ilovejs.net";
var showSite = function(){
alert(website);
}
return new function(){
this.website = website;
this.showSite = showSite;
}
}
[/javascript]
五种方式都例举出来了,性能方面的差异在各个浏览器都有不同的显示,还是大家自己来测试测试吧,“相信浏览器才是正道”。测试页面
附录:这个测试工具是本人编写的一个简单的对象Watch。它提供了三个方法:start,stop,report。顾名思义,start是开始记录时间,带有一个title参数来标注不同的测试标题说明,stop是记录每一次的结束时间,report是输出全部的测试结果。具体是使用方式可以看上面的测试页面,也可以浏览下面的源代码。
[javascript]
var Watch = {
result: [],
guid: -1,
start: function(title){
this.result[++this.guid] = [title || this.guid + " queue", new Date().getTime()];
},
stop: function(){
var r = this.result[this.guid];
r[1] = new Date().getTime() – r[1];
},
report: function(flag){
this.guid = -1;
if (!flag) {
var div = document.createElement("div");
var str = [];
for (var i = 0, l = this.result.length; i < l; i++) {
str.push("<p>" + this.result[i][0] + " : <span style=’color:#c00;’>" + this.result[i][1] + "</span> ms</p>");
}
div.innerHTML = str.join("");
document.body.appendChild(div);
div = null;
} else {
return this.result;
}
}
}
[/javascript]
圣诞节快来了,好冷啊,呵呵