采用哪种方式(JS高级程序设计)
目前使用最广泛的是混合的构造函数/原型方式。此外,动态原型方法也很流行,在功能上与构造函数/原型方式等价。可以采用这两种方式中的任何一种。不过不要单独使用经典的构造函数或原型方式。
还记得构造函数是怎样的吗?
function Tree (name,type) {
this.name = name;
this.type = type;
…
}
var oTree = new Tree (“av”,"unknown”); //实例化对象
还有原型方式:
function Tree() {
Tree.prototype.name = “av”;
Tree.prototype.type = “unknown”;
…
}
var oTree = new Tree(); //实例化对象
考虑下面的代码
var str = “Hello”; str+ = “world”;
实际上,这段代码在后面执行的步骤如下:
- 创建存储"Hello”的字符串。
- 创建存储"world”的字符串。
- 创建存储连接结果的字符串。
- 把str当前的内容复制到结果中。
- 把"world"复制到结果中。
- 更新str,使它指向结果。
而下面的方法只用了两步:
var arr = new Array; arr[0] = “helllo”; arr[1] = “world”; var str = arr.join(“”);
-
创建存储结果的字符串。
-
把每个字符串复制到结果中合适位置。
这种方法很好,但是还好更好的方法。要使它更容易理解,可以用StringBuffer类打包该功能:
function StringBuffer (){ this._strings_ = new Array; } StringBuffer.prototype.append = function (str){ this._strings_.push(str); }; StringBuffer.prototype.toString = function () { return this._strings_.join(“ ”); }
这段代码首先注意的是strings属性,本意是私有属性。它只有两个方法,即append()和toString()方法。append()只有一个参数,它把该参数回到字符串数组中,toString()方法调用数组的join()方法,返回真正连接成的字符串。要用StringBuffer对象连接一组字符串,可以用下面的代码:
var buffer = new StringBuffer(); buffer.append(“hello”); buffer.append(“world”); var result = buffer.toString();
可用下面的代码测试StringBuffer对象和传统的字符串连接方法的性能:
var d1 = new Date(); var str = “”; for (var i=0;i<10000;i++){ str+ = “test” } var d2 = new Date (); document.write(“Concatenation with plus:”+(d2.getTime() – d1.getTime())+”milloseconds”); var oBuffer = new StringBuffer (); d1 = new Date (); for(var i=0;i<10000;i++){ oBuffer.append(“text”); } var sResult = buffer.toString (); d2 = new Date(); document.write(“<br/>Concatenation with StringBuffer:”+(d2.getTime() – d1.getTime())+”milloseconds”);
测试结果:使用StringBuffer类比使用加号节省50%-60%的时间。