很久很久没有更新博客了.
忙,只是一个自我阿Q的借口 ------每个人在写博客之前以及写博客的时候都是很忙的.
时间总是可以挤点出来的,今天我要是不去挤,我想这篇博客又流产了.罪过罪过....
JavaScript中几乎每个对象都有一个 toString()方法,而且是内置的.用来输出当前
变量的信息. 但是对于我们最常用的Object对象.每次用 toString都是打印[object Object]
{a:1,b:2,c:3}.toString() ===> [object Object]
让人十分郁闷,为此我实现了一个友好的,打印Object各成员的函数,
支持嵌套输出 ,也能友好打印数组内容.
这里贴出代码,希望和大家一起学习,一起完善,改进这个函数.
说句题外话,用 Vim写程序,可不是一般的爽啊.
我表达能力有限,只能用 "爱不释手" 来表达我对 Vim 的爱
http://www.vim.org/
<script language="JavaScript">
/* vi:set tw=0 ts=4 sw=4 noet nowrap ft=javascript fdm=syntax ai: */
/*
Date对象输出为字符, 返回类似: "2002年2月1日 1:01:01" 的格式
part:
0:(默认)返回日期和时间
1:只返回日期
2:只返回时间
sp:
undefined :(默认)返回 "2002-2-1 1:01:01"
非undefined: 返回 "2002年2月1日 1:01:01"
*/
Date.prototype.tos=function(part,sp){
var hash={"0":"","1":"Date","2":"Time"} , ret , part=part || 0;
//因为 toLocaleString的输出完全处决于客户机操作系统的设置,所以我们要先测试一下
if ((new Date(2000,1,1,1,1,1)).toLocaleString()=="2000年2月1日 1:01:01"){
ret=String(this["toLocale"+hash[part]+"String"]());
}else{ //不是我们想要的格式,只能自己实现
var yyyy=this.getFullYear();
var nn=this.getMonth()+1;
var dd=this.getDate();
var hh=this.getHours();
var mm=String("00"+this.getMinutes()).right(2);
var ss=String("00"+this.getSeconds()).right(2);
var dateString=yyyy+"年"+nn+"月"+dd+"日";
var timeString=hh+":"+mm+":"+ss;
hash={"0":dateString+" "+timeString,"1":dateString,"2":timeString};
ret= hash[part];
}
return sp==undefined?ret.replace(/[年月]+/g,"-").replace("日",""):ret;
}
RegExp.prototype.tos=function(){
return this.toString();
}
Number.prototype.tos=function(){
return this.toString();
}
String.prototype.tos=function(){
if (this.indexOf("'")!=-1){
return '"'+this.replace(/"/g,'\\"')+'"';
}else{
return "'"+this.replace(/'/g,"\\'")+"'";
}
}
/*
"".left 和 "".right 模拟实现 vbs里面的 left和right函数,截取字符串
不过这里的实现支持中文 ,会把一个汉字当两个字符来计算。
*/
String.prototype.right=function(n){
return this.slice(this.slice(-n).replace(/[\x00-\xff]/g,"").length-n);
}
String.prototype.left=function(n){
// alert("abcdefg".left(3)==="abc");alert("中国人cdefg".left(5)==="中国"); //alert("中国abcdefg".left(5)==="中国a")
return this.slice(0,n-this.slice(0,n).replace(/[\x00-\xff]/g,"").length);
}
//列出函数名和参数列表,内容用替代
Function.prototype.tos=function(){
var ret=this.toString();
return ret.left(ret.indexOf(")"))+"){}";
}
Array.prototype.tos=function(){
for(var i=0,arr=[];i<this.length;i++) { arr.push(this[i].tos?this[i].tos():this[i].toString()); }
return "["+arr.join(",")+"]";
}
Error.prototype.tos=function(){
var str=this.number?"number["+this.number+"],":"" //FireFox不支持 Error.number
return "Error: "+str+"message["+this.message+"]";
}
/*
功能:返回Object结构里面的各成员的key:value的一个友好字符串格式,方便debug
listAll: 是否显示当前 Object的 prototype树中的成员
tbs: 递归现实次级Object成员时的 tab缩进层数. (注意:代码中使用的是4个空格而非一个tab)
*/
Object.prototype.tos=function(listAll,tbs){
var value,ret='{\n',obj=this;
tbs=tbs || 0;
listAll=listAll || 0;
var prefix=Math.pow(10,tbs).tos().slice(1).replace(/0/g," ");
for(var key in obj){
if ((!obj.hasOwnProperty(key)&& !listAll)||(!!listAll&&key=="tos")) continue;
value=obj[key];
switch(value.constructor){
case String:
case Date:
case RegExp:
case Array:
case Number:
case Function:
case Error:
value=value.tos();
break;
case Object:
value=value.tos(listAll,++tbs);
break;
default:
try{value=value.toString();}catch(x){value=""};
}
ret=ret+[prefix+key," : ",value,"\n"].join("");
}
ret+=prefix+"}";
return ret;
}
// 下面是测试代码
var re=/^\d\/\w\\.*?$/gi;
var re2=new RegExp("\\d\\\\.*?\\/$","img");
var str="it's a string";
var str2='it\'s a string "aaa" ';
var num=.1;
var num2=-255;
var dat=new Date();
var dat2=new Date(2007,3,3,3,3,3);
var obj=new Object();
var obj2={str:str,num:num,re:re,dat:dat,obj:{a:1,b:2,c:{level3:123456}}};
var arr=new Array();
var arr2=[re,str,num,dat];
var func=function(a,b,c){return a+b+c};
var func2=new Function("a","b","c","return a+b+c");
var err=new Error();
var err2=new Error(-9,"My Error Object");
var myobj={
re:re, re2:re2
,str:str, str2:str2
,num:num, num2:num2
,dat:dat, dat2:dat2
,func:func, func2:func2
,err:err, err2:err2
,obj:obj, obj2:obj2
,arr:arr, arr2:arr2
,dom:window,dom2:document
}
myobj.var1="gorush1";
myobj.var2=1234567;
function gorush(){
this.a1=1;
this.a2=2;
}
gorush.prototype.a3=3;
gorush.prototype.a4=function(x){return x};
var mygorush=new gorush();
alert(myobj.tos())
alert(mygorush.tos())
</script>
/* vi:set tw=0 ts=4 sw=4 noet nowrap ft=javascript fdm=syntax ai: */
/*
Date对象输出为字符, 返回类似: "2002年2月1日 1:01:01" 的格式
part:
0:(默认)返回日期和时间
1:只返回日期
2:只返回时间
sp:
undefined :(默认)返回 "2002-2-1 1:01:01"
非undefined: 返回 "2002年2月1日 1:01:01"
*/
Date.prototype.tos=function(part,sp){
var hash={"0":"","1":"Date","2":"Time"} , ret , part=part || 0;
//因为 toLocaleString的输出完全处决于客户机操作系统的设置,所以我们要先测试一下
if ((new Date(2000,1,1,1,1,1)).toLocaleString()=="2000年2月1日 1:01:01"){
ret=String(this["toLocale"+hash[part]+"String"]());
}else{ //不是我们想要的格式,只能自己实现
var yyyy=this.getFullYear();
var nn=this.getMonth()+1;
var dd=this.getDate();
var hh=this.getHours();
var mm=String("00"+this.getMinutes()).right(2);
var ss=String("00"+this.getSeconds()).right(2);
var dateString=yyyy+"年"+nn+"月"+dd+"日";
var timeString=hh+":"+mm+":"+ss;
hash={"0":dateString+" "+timeString,"1":dateString,"2":timeString};
ret= hash[part];
}
return sp==undefined?ret.replace(/[年月]+/g,"-").replace("日",""):ret;
}
RegExp.prototype.tos=function(){
return this.toString();
}
Number.prototype.tos=function(){
return this.toString();
}
String.prototype.tos=function(){
if (this.indexOf("'")!=-1){
return '"'+this.replace(/"/g,'\\"')+'"';
}else{
return "'"+this.replace(/'/g,"\\'")+"'";
}
}
/*
"".left 和 "".right 模拟实现 vbs里面的 left和right函数,截取字符串
不过这里的实现支持中文 ,会把一个汉字当两个字符来计算。
*/
String.prototype.right=function(n){
return this.slice(this.slice(-n).replace(/[\x00-\xff]/g,"").length-n);
}
String.prototype.left=function(n){
// alert("abcdefg".left(3)==="abc");alert("中国人cdefg".left(5)==="中国"); //alert("中国abcdefg".left(5)==="中国a")
return this.slice(0,n-this.slice(0,n).replace(/[\x00-\xff]/g,"").length);
}
//列出函数名和参数列表,内容用替代
Function.prototype.tos=function(){
var ret=this.toString();
return ret.left(ret.indexOf(")"))+"){}";
}
Array.prototype.tos=function(){
for(var i=0,arr=[];i<this.length;i++) { arr.push(this[i].tos?this[i].tos():this[i].toString()); }
return "["+arr.join(",")+"]";
}
Error.prototype.tos=function(){
var str=this.number?"number["+this.number+"],":"" //FireFox不支持 Error.number
return "Error: "+str+"message["+this.message+"]";
}
/*
功能:返回Object结构里面的各成员的key:value的一个友好字符串格式,方便debug
listAll: 是否显示当前 Object的 prototype树中的成员
tbs: 递归现实次级Object成员时的 tab缩进层数. (注意:代码中使用的是4个空格而非一个tab)
*/
Object.prototype.tos=function(listAll,tbs){
var value,ret='{\n',obj=this;
tbs=tbs || 0;
listAll=listAll || 0;
var prefix=Math.pow(10,tbs).tos().slice(1).replace(/0/g," ");
for(var key in obj){
if ((!obj.hasOwnProperty(key)&& !listAll)||(!!listAll&&key=="tos")) continue;
value=obj[key];
switch(value.constructor){
case String:
case Date:
case RegExp:
case Array:
case Number:
case Function:
case Error:
value=value.tos();
break;
case Object:
value=value.tos(listAll,++tbs);
break;
default:
try{value=value.toString();}catch(x){value=""};
}
ret=ret+[prefix+key," : ",value,"\n"].join("");
}
ret+=prefix+"}";
return ret;
}
// 下面是测试代码
var re=/^\d\/\w\\.*?$/gi;
var re2=new RegExp("\\d\\\\.*?\\/$","img");
var str="it's a string";
var str2='it\'s a string "aaa" ';
var num=.1;
var num2=-255;
var dat=new Date();
var dat2=new Date(2007,3,3,3,3,3);
var obj=new Object();
var obj2={str:str,num:num,re:re,dat:dat,obj:{a:1,b:2,c:{level3:123456}}};
var arr=new Array();
var arr2=[re,str,num,dat];
var func=function(a,b,c){return a+b+c};
var func2=new Function("a","b","c","return a+b+c");
var err=new Error();
var err2=new Error(-9,"My Error Object");
var myobj={
re:re, re2:re2
,str:str, str2:str2
,num:num, num2:num2
,dat:dat, dat2:dat2
,func:func, func2:func2
,err:err, err2:err2
,obj:obj, obj2:obj2
,arr:arr, arr2:arr2
,dom:window,dom2:document
}
myobj.var1="gorush1";
myobj.var2=1234567;
function gorush(){
this.a1=1;
this.a2=2;
}
gorush.prototype.a3=3;
gorush.prototype.a4=function(x){return x};
var mygorush=new gorush();
alert(myobj.tos())
alert(mygorush.tos())
</script>