2.5.1 如何初始化一个object object属于系统特权对象,你可以这样初始化一个object:
var a = { x:100, y:20, z:56, type:"a test" }; 他的效果和如下的as等价:
var a = {}; //或者 var a = new Object();
a.x = 100;
a.y =20;
a.z =56;
a.type = "a text";
比如函数Color.setTransform()用于设置mc色彩,需要一个colorxm对象,我们可以创建一个匿名对象给他(我说过,object是幽灵,不需要名字的)
new Color(_root).setTransform({ra:100, rb:-100, ga:100, gb:-100, ba:100, bb:-100, aa:100, ab:0});
//_root就覆盖上了一层浅浅的黑色
注意,我们不能给非object的对象添加子成员。object子成员访问之前,你必须首先创建这个object。 比如,我们必须首先操作 a={} 然后才能 a.x = 100; 举一个我犯过的错误:你看,在一个rpg里面我们通常这样做
var PLAPER_MAX = 4;
player = {};
for(var i = 0 ; i < PLAPER_MAX ; i++ ){
player[i] . hp = 100;
player[i] . atk = 12;
player[i] . def = 5;
}
trace( player [0]. hp);
看上去很正常,不是吗? 但是结果会失败,player[0]~[3]都是undefined,更加别提属性了。因为player[i]并没有被创建为object 操作者就试图访问 player[i]的子成员。
改为:
var PLAPER_MAX = 4;
player = {};
for(var i = 0 ; i < PLAPER_MAX ; i++ ){
player[i] = {};
player[i] . hp = 100;
player[i] . atk = 12;
player[i] . def = 5;
}
容易理解,object是幽灵,他的名字如果没有抓住任何object,那么这个名字什么也不是……
2.5.2 Object的成员访问 Object的成员名(包括“数组“)是以字符串形式保存在 Object成员表里面的。比如:
a .x = 20;
那么成员名就是 "x"
object的成员有两种操作方法,点语法和[]
语法,其中数组存取符功能更加强大,它可以解析动态的字符串和数字变量: 你看,和一般语言一样,我们可以这样访问一个“正常的"成员,下面修改了一个名称为字符串"x1"的成员: a.x1 = 20; 我们还可以用 [] 访问 a.x,下面表达式和上面等价:
a["x1"] = 20;
数组运算符 object[ item ]的强大之处在于,他可以解析变量。下面的表达式首先得到一个字符串"x1",然后同样可以访问 a.x1:
count = 1;
a["x" + count] = 20;
我们可以用这种技术完成很多东西,呵呵,甚至可以替代结构,比如就可以迭代访问 enemy1hp 、 enemy4hp 、enemy3damage 等等咚咚了, 尤其有意思的是,flash将数组和结构统一了,如下的操作:
a[0] =5
到底干了什么呢?
实际上它修改的变量是 a."0" !!!
所以上述语句和如下做法等价:
a["0"] = 5;
注意:a.0 是非法表达式,所以不能通过。 由于this指代当前object,所以这样写也是一样的(你可以用这种方法替代eval):
this["0"] = 5 更加匪夷所思的是,由于function也是引用,所以有这种古怪的语法:
function addNum (x,y){
trace( x+y );
}
this["addNum"] (10,45);
米噢~~~~第一次知道的时候下巴抖掉下来了。
2.5.3 删除一个变量 一般来说,你总可以用
delete (a)
来删除a,除非a是一个get/set属性。 如果delete (a) 失败会返回false,这个特性可能会有用……(不过我永远是用trace检查) 类似的操作还有:
a = null;
a = undefined;
不需要担心 a 如果是object的话,需不需要事先删除a 下面的所有变量:系统的垃圾处理机制会帮你完成一切。
2.5.4 成员列表:不需要链表的理由object不但是数组和类的集合,他还是一个超级容器。不久你就会看到,你根本不需要烦人的链表,flash最基本的结构:object就为你打造了一切。 正如我之前所说的,每个object都维护着一个成员表,所以你可以用flash 特有的 for... in 循环循环。它每次迭代体都会获得当前成员的名称字串。
for( var i in myObject) {
trace( myObject[i] );
} 由于所有成员名称都是字符串,联系上面所说的数组运算符,我们总可以用: object[i] 得到当前成员,多么精妙和统一的设定!!
var myObject = {};
myObject . x1 = 10;
myObject[1] = 12;
myObject.callFunc = function() { }; for( var i in myObject ){
trace("typeof i is:" + typeof i + " i: " + i + " obj: " + myObject[i] );
}
typeof i is:string i: callFunc obj: [type Function]
typeof i is:string i: 1 obj: 12
typeof i is:string i: x1 obj: 10
所以……根本不需要链表了……建一个object , 有新变量,直接添进去! 要删变量,直接删掉名字! 要遍历,直接 for ... in!
如果您有什么疑问,可以至论坛提出或者解答他人的疑问 返回页面顶部