2.3 object :引用 —— 一个幽灵
和java类似,flash里面的另外一类变量就是引用。 你也许很熟悉c里面的结构或者c++里面的类。我们定义一个struct ,它拥有自己的成员属性,比如name、pos等等。对于类c的构架来说,一个结构体就像一块石头,他的每个成员都是固定的,你甚至有办法知道他在你的虚拟空间中的地址和大小。这种确定性带来了安全和灾难。
它是定制的,定制的东西就是简单的,可以避免很多小错误;
然而定制的东西是不同用的,你需要通用性的时候灾难就出现了:比如,如果你要实现一个通用堆栈……可是不同的对象类型不同,int型堆栈只能用于int,student堆栈只能用于student……你就需要使用模板、虚函数多态等等一大堆咚咚
其他的灾难比如饱受指责的内存管理什么的就不说了。
object是一个很有意思的东西,他和c /c++的复杂类构架的区别在于:他是一个幽灵。
我们可以这样创建一个object:
{} 或者 new object(); 他们在语法上是等价的。 那么这个object在什么地方呢?没有人知道。我说过,他是一个幽灵。
如果你直接写一个object,但是不把它赋值给任何变量,那么你创建了一个“匿名对象”,但是谁也得不到他:
{}; //创建一个空的匿名object
new color( this ); //创建一个匿名的color对象,初始化参数为this 你可以在很多地方使用匿名object,你召唤并且使用他,然后他就消失了,比如 : new color( this ).setrgb(0xff0000); //当前mc变成全红 你可以用一个变量抓住他很长时间,直到这个变量用于抓住或者装另外的东西:
var a= new object(); 这样,这个变量仿佛就是 我们建立的object一样,但是这只是一个假象。
我们控制了这个object吗? ——是的,你看,我们可以操作这个object:
a={}
a.hp = 100;
trace(a.hp)
a. littleobject= {}; //在a下面建立一个新的object
a. littleobject. x =10;
a. littleobject. y =20;
trace(a.littleobject + " x:"+ a.littleobject.x + " y:" +a.littleobject.y);
输出: 100
[object object] x:10 y:20 和flash的其他特性一样,一个object可以装下任何东西,没有任何母版的限制。但是你却无法真正获得它:你无法杀死他。
接着上面的代码,加上:
delete(a);
trace(a);
trace(a.hp);
噢,出现的结果是:
undefined
undefined a被删除了,不是吗?
不是的。你删除的只是抓住a的变量。如果你同时用b抓住那个object,你会发现,那个object其实还是漂浮在某处~~~~
a={} //a引用一个新建立的object
b=a; //b也引用同一个object
a. xx =10;
trace("before delete a, a.xx:" + a.xx + " b.xx:" + b.xx);
delete(a);
trace("after delete a, a:" +a + " b.xx:" +b.xx)
//---------------------------------------------------------------------------------------------- before delete a, a.xx:10 b.xx:10
after delete a, a:undefined b.xx:10 你看,被删掉的只是他的一个名字……只要仍然有变量能够访问他,他就永远存在…… 那么那个幽灵什么时候消失呢?谁也不知道。在所有人都遗忘了他之后,当没有一个活动变量引用他的时候,可怕的~~~~ 垃圾处理器~~~~ 会自动删掉他的~~~~ 然而,他是什么时候被删掉的? 谁也不知道……
链表的实现片断
好嘛,记住,你的变量名只是“抓住”了幽灵而已,它不会产生和消除实例。知道了这些,你就可以实现你的链表了~~~
比如这些操作片断:
nodenow.next = {}; //建立新的node
nodenow = nodenow.next;
nodenow.data = newdata; //删除nodenow.next的方法
nodenow.next = nodenow.next.next; //注意,不需要删除 nodenow.next,也不需要知道nodenow.next.next是否存在 //遍历
var nodenow = nodehead;
while(nodenow !=null){
dosomething();
nodenow = nodenow.next;
} 但是你真的需要链表吗? 在2.5 和2.6 你会明白,flash已经拥有更好的东西了。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器