trace2 in FMS

基于fczone改写的framework.asc(详见让FMS中的trace支持Object),我稍作修改,加入了对Array和Object的判断,做成了这个trace2()函数,使用前只需先load("trace2.acs")即可,不需要载入framework.asc了:

8月13日更新:解决了不处理Object的问题

 1function trace2(data){
 2if(typeof(data) == "object"){
 3if(data instanceof Stream || data instanceof File || data instanceof LoadVars ||
 4data instanceof XML || data instanceof XMLSocket || data == application)    {
 5//
 6trace(data.toString());
 7}else if(data instanceof SharedObject){
 8var dat = new Object();
 9//
10trace("[object SharedObject name="+data.name+"]");
11//
12var props = data.getPropertyNames();
13for(var i in props) {
14if(props[i]){
15var o = data.getProperty(props[i]);
16trace("\t"+props[i]+" = " + objString(o));
17}
18}
19//
20}else{
21trace(objString(data));
22}
23}else{
24trace(data.toString());
25}
26}
27
28/*將內容對象轉換成字符串
29* @param data   要被轉換的對象
30* @param ignore 需要跳過的屬性
31*/
32function objString(data, ignore){
33var msg;
34if(typeof(data) == "object"){
35if(data instanceof Array){
36msg = objectString(data, ignore, "Array");
37}else if(data instanceof Object){
38msg = objectString(data, ignore, "Object");
39}else if(data instanceof Client){
40msg = "[object Client ip=" + data.ip + " uri="+data.uri+" args=" + objString(data.__ARGUMENTS__, data)+"]";
41}else if(data instanceof NetConnection){
42msg = "[object NetConnection connected=" + data.isConnected + " uri="+data.uri+"]";
43}else{
44msg = data;
45}
46}else{
47msg = data.toString();
48}
49//
50return msg;
51}
52
53/*
54將參數中的對象轉換成字符串。此函數與objString的區別是,objString轉換所有的對象類型,而objectString僅轉換Object對象類型
55* @param data   要被轉換的對象
56*/
57function objectString(data, ignore, type){
58/*由于Remoting返回的實際上是關聯數組而非對象,因此這些“對象”其實屬于Array類型
59这样就给判断真正的类型造成了难度。因为联合数组实际上是没有length属性的,必须用for in循环来获取其中的值
60通过判断length是否存在,是用不同的循环获取
61*/
62if(type == "Array"){
63if(data.length){
64var msg = "[";
65for(var i=0; i
66if(data[i] == ignore){
67continue;
68}
69msg += objString(data[i]);
70if(i != data.length - 1){
71msg += ", ";
72}
73}
74msg += "]";
75return msg;
76}else{
77//如果是关联数组,就把它变成一个真正的对象,并调用对象处理程序
78var o = new Object();
79for(var i in data){
80o[i] = data[i];
81}
82return objectString(o, null, "Object");
83}
84}else if(type == "Object"){
85//如果是真正的Object
86var msg = "{";
87for(var i in data){
88if(data[i] == ignore){
89continue;
90}
91msg += i + ":" + objString(data[i]);
92msg += ", ";
93}
94msg = msg.slice(0, -2); //去掉最后的一个逗号和一个空格
95msg += "}";
96return msg;
97}
98}