最近在看一同事寫的代碼時,有一個字串用了一堆"+"號,看了半天沒明天到底會輸出什麼樣的內容,就想到用字串串連的類,把以前的方法寫成了類的方式,方便調用。下面的類支援執行個體調用和靜態調用,參數可以是單獨的字串,或者json的格式,或者類似參數數組的方式,見下面樣本:
/*** @class String concat* @return {StrBuf/String}* @constructor* eg:var buf = new StrBuf("contructor str\n");buf.push("hello,").push("Today is {0}, {1}", "Monday", "March 28th").push("${name} is a good ${category} company", {name: "Google", category: "Intenet"});document.write(buf);// auto call toString methodconsole.log(buf);console.log(StrBuf("static {0} method", "invoke"));*/var StrBuf = function(s) {this.data = [];if(s) {var args = arguments, buf;if(this instanceof StrBuf) {this.push.apply(this, args);}else {// static invokebuf = new StrBuf();return buf.push.apply(buf, args).toString();}}};StrBuf.prototype = {// add String to the instancepush: function(s, j) {var args = arguments;if(args.length < 2) {this.data.push(s || "");}else if(typeof j == 'object') {this.data.push(s.replace(/\$\{([\w.]+)\}/g, function($, $1) {return ($1 in j) ? j[$1] : $;}));}else {this.data.push(s.replace(/\{(\d+)\}/g, function($, $1) {return args[+$1 + 1];}));}return this;},toString: function() {return this.data.join("");}};
調用樣本如下:
var buf = new StrBuf("contructor str\n");buf.push("hello,"); buf.push("Today is {0}, {1}", "Monday", "March 28th"); buf.push("${name} is a good ${category} company", {name: "Google", category: "Intenet"}); document.write(buf);// auto call toString method console.log(buf); console.log(StrBuf("static {0} method", "invoke"));