参与本文讨论:闪吧本文讨论帖
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已经拥有更好的东西了。