| 谈谈Flash的一些语法基础和系统核心 2.3 object :引用 — 一个幽灵 |
|
谈谈Flash的一些语法基础和系统核心 2.3 object :引用 — 一个幽灵 |
| 作者:佚名 来源:闪吧 作者: ox_thedarkness 更新:2007-1-13 20:47:28 错误报告 我要投稿 |
参与本文讨论:闪吧本文讨论帖 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已经拥有更好的东西了。
|
|
| 文章录入:skyuu 责任编辑:skyuu |
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |