大家都知道,flash中trace的作用非常大,凡是flash程序员,无不没有不用trace的,trace是用来测试输出的,在测试阶段通常使用trace来查看数据的。当然发布以后trace就不能用了。是需要其他工具来查看输出的,这里简单介绍一下De MonsterDebugger,我在做项目的时候经常用到的工具。
trace可以输出:数值、字符串、数组、布尔值==。而且对这些类型的输出可以确切的看到其实际内容。
但是大家可能会对类进行trace的时候犯难。因为trace(new A),(A extends Object)输出的结果却是[object A],并不能显示类A的详细内容。这该怎么办呢,这就是我要讲的内容。
其实仔细研究下就会发现[Object A]其实是A的toString()方法的结果,由于flash中的所有类都继承自Object,而对类的实例执行trace的时候执行的是类的toString()方法。toString()是Object的方法。所以任何类都有toString()方法,因此对类的实例进行输出的时候就不会报错。而会出现像[Object A]这样的结果。讲到重点了。我们今天要做的扩展trace的能力,实际上就是重写类的toString()方法。很简单吧。只要你在你的自定义类中重写这个方法,那么在进行trace的时候,就可以随性所欲的想输出什么就能输出什么了。
举个例子:
2
3 public class A{
4 private var attr1:String;
5 private var attr2:String;
6 private var attr3:String;
7
8 public function A(str1:String,str2:String,str3:String):void{
9 attr1=str1;
10 attr2=str2;
11 attr3=str3;
12 }
13
14 public function toString():String{
15 return "[attr1:"+attr1+"]\n[attr2:"+attr2+"]\n[attr3:"+attr3+"]";
16 }
17 }
18 }
上面定义了一个类A重载了toStirng()方法,大家可能会疑问为什么没用override呢,调用flash帮助文档上的一句话:“注意:Object 类的方法是在 Object 的原型上动态创建的。 要在 Object 的子类中重新定义该方法,请不要使用 override
关键字。 例如,Object 的一个子类实现 function toString():String
而不使用基类覆盖。”
新建fla文件在动作面板里写上var a:A=new A("ab","cd","ef");trace(a);
测试下,就会在输出面板里输出
[attr1:ab]
[attr2:cd]
[attr3:ef]
达到了我们的目的,toString()方法的实体可以任意改,只要能达到自己的要求就行。
总结:trace(类的实例),实际上是执行了trace(类的实例.toStirng());所以只要给类添加toString方法就可以用trace来显示类的详细信息了。