posts - 25, comments - 300, trackbacks - 15, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

很久很久没有更新博客了.
忙,只是一个自我阿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>

Feedback

#1楼 [楼主]   回复  引用  查看    

2007-04-03 01:41 by Go_Rush      
这个随笔的代码颜色是由 vim 自动生成的. 颜色方案 desert
在 vim里面非常好看,养眼. 可惜和我博客的skin格格不入..

现在太晚了,眼睛都打不开了, 明天再改变一下代码颜色和底色

#2楼    回复  引用  查看    

2007-04-03 01:53 by 木野狐      
hehe, 我也喜欢 vim, 可是没有那么多时间去练习快捷键。还有就是配置各种插件的,也很费精力。不过摆弄好了的确是很爽。
所以现在用的比较多的还是 EditPlus(General purpose) 和 Ulipad(for python).

#3楼    回复  引用  查看    

2007-04-03 01:54 by 木野狐      
我更喜欢 darkblue theme.

#4楼    回复  引用  查看    

2007-04-03 08:51 by Jeffrey Zhao      
千万不要改变JavaScript里原有功能的作用阿,说不定哪天就会出问题了……

#5楼 [楼主]   回复  引用  查看    

2007-04-03 09:04 by Go_Rush      
@Jeffrey Zhao

我没有改变任何功能啊,不过可能标题误导了你.标题说的是 toString的实现
实际代码是 Object.prototype.tos.

不过扩展了 Object.prototype树. 在for(var key in obj) 遍历的时候会显示tos对象

如果你想实现 tos 功能,又不想影响 Object.prototype.
可以把稍微改装一下.

写成 Object.tos=function(obj, listAll,tbs){....}方式

调用的时候要多打几个字
alert(Object.tos(obj))

#6楼 [楼主]   回复  引用  查看    

2007-04-03 09:19 by Go_Rush      
@木野狐
1. vim 是可以嵌入到 vs2005里面作为源代码编辑器的
2. 安装配置 vim 其实很简单的

ftp://ftp.vim.org/pub/vim/pc/gvim70ole.zip (gvim for win32)
ftp://ftp.vim.org/pub/vim/pc/vim70rt.zip (gvim runtime)
有这两个就OK了,基本上支持所有语言的语法高亮,缩进等

再装一个word_complete.vim 可以对任何源代码进行自动提示补充.
比如 我输入 var abcdfff="123"
下次我输入 ab的时候,自动在ab后提示 cdfff 按 TAB就自动填充了,方便极了

3. 希望你再返回 vim 大家庭啊.

#7楼    回复  引用  查看    

2007-04-03 09:28 by 玉开      
不错

#8楼    回复  引用  查看    

2007-04-03 09:31 by Anders Liu      
到底讨论js,还是editor?

#9楼    回复  引用  查看    

2007-04-03 09:38 by 木野狐      
@Go_Rush
嘿,我说的是目录浏览等高级插件,呵呵。代码高亮和自动提示我知道是比较简单的。在 Python-Chinese 邮件列表里面看到一个 "vim 推广录像",感觉挺有意思:
http://amix.dk/upload/vimin.mov

前一阵为了设置文件默认保存为 UTF-8, 把 vim 的菜单弄的乱码了,所以有点感想。
我并没有放弃 vim,只是觉得要在实际开发中熟练快捷的应用,要多花点时间练习,现在还是当兴趣来玩。

#10楼    回复  引用  查看    

2007-04-03 09:38 by 木野狐      
@Anders Liu
都讨论也很好啊。别怪我跑题了,呵呵。

#11楼    回复  引用  查看    

2007-04-03 09:39 by 木野狐      
tos 的名字有点怪,可以考虑用 toStr

#12楼    回复  引用  查看    

2007-04-03 09:53 by e表      
看看vim是不是我所需要的东西? (纯.net写的web报表开发工具在: http://www.fcsoft.com.cn/webreport.htm)

#13楼    回复  引用  查看    

2007-04-03 10:57 by 布尔      
十分好,收藏了先

#14楼    回复  引用  查看    

2007-04-03 13:14 by <font color="red" size=2px>Clark Z      
不错,收藏!

#15楼    回复  引用  查看    

2007-04-03 13:30 by Jeffrey Zhao      
@Go_Rush
嗯,没错,还有一点就是,千万不要扩展Object.prototype,呵呵。