AS3.0之Object篇
...
Bing
...
Flex
...
4
/1472
...
2 years 3 months ago
Package :Top Level
Class :public dynamic class Object
Object class 是所有类的基类,您可以使用关键字new 来创建Object 实例,并且可以给他们动态的赋值(注意Class中的dynamic关键字,该关键字决定了可以给Object 实例动态赋值)。同时Object 实例可以按照下面的方式创建:
var obj:Object = {a:”foo”,b:“bar”};
所有未申明继承的class都被默认的继承自Object class。
您可以使用Object class 来创建联合数组,一个联合数组可以看成是一个Object,并且它的每一个“字——值”(原文是Key——value,,其意思就是联合数组A的一个属性B的对应值)都代表一个一个属性和值。使用Object数据类型创建联合数组的另一个原因就是您可以在创建的时候给该数组赋予属性和值。下面的一个例子使用了Object创建了一个联合数组,然后使用”.”操作符和数组操作符来访问其值,最后我们加了一个“字——值”来给该数组添加一个新的属性:
var myAsscoArray:Object = {fname:“John” , lname:”Public”};
trace(myAsscoArray.Fname); //Output :John
trace(myAsscoArray.Lname); //Output :Public
trace(myAsscoArray[“lname”]): //Output:Public
myAsscoArray.Initial = “Q”;
trace(myAsscoArray.Initial); //Output:Q
Public Properties(共有属性,以后将不再解释)
constructor:Object
指向Object class或者Object实例的constructor method(构造函数,以后不再解释)
prototype:Object [static]
指向Object Class 或者Function Object 的原型(prototype)
Public Methods(公共方法,以后不再解释)
Object()
创建一个Object实例,并且使该实例的constructor property(属性)指向其constructor method;
hasOwnProperty(name:String):Boolean
判断是否有具有该名称的property;
isPrototypeOf(theClass:Object):Boolean
判断一个对象是否在指定的对象的原型链中
propertyIsEnumerable(name:String):Boolean
判断一个指定的属性是否存在并是否可列举
toString() :String
返回一个代表该对象的字符串
valueOf():Object
返回对象的原始值
详细属性:
constructor 属性
public var constructor:Object
指向 object class或 Object实例的constructor method。如果该Object是该Class的实例,那么constructor property指向该class object。如果一个object是用constructor function创建的,那么constructor property就指向constructor function。
如果您使用class keyword 来定义一个类,那么那个class的prototype对象便有一个指向那个classs object的constructor property。类的实例object继承了这个property。例如,下面的代码创建了一个class和一个名字为myA的class 实例。
dynamic class A{}
trace(A.prototype.c constructor); // [class A]
trace(A.prototype.constructor == A); // true
var myA:A = new A();
trace(myA.constructor == A); // true
高级用户可能会选择使用function(函数,以后不再解释) keyword 来取代使用class keyword 去定义一个可以被用来当作模块使用的 Fuction object 来创建 objects。这样一个function叫做constructor function,因为你能结合使用 new operator(运算符,以后不再解释)来创建新的objects。如果你使用function keyword 来创建一个constructor function,它的prototype object 便有一个指向该constructor function的constructor property。这样产生的objecty便从constructor function的protype object继承了这样一个constructor property。例如:下面的代码创建了一个新的constructor function,f,和一个名为myF的object:
function f(){}
trace(f..prototype..Constructor); // function Function(){}
trace(f.Prototype.Constructor == f); // true
var myF = new f();
trace(myf.Constructor == f); // true
注意:这个constructor property 是可写的,这意味着您可以通过赋值的方式来修改它的值。修改constructor property的属性是不被推荐的,但是如果您要写的代码取决于 constructor property的值,那么您应该确保它的值没有被重置。要想修改它的值,只能通过prototype object来指向它(例如:className..Prototype.Constructor)。
相关查看:
Class,Function,prototype,Methods
prototype 属性
public static var prototype:Object
指向一个类或函数对象的prototype对象。这个prototype属性是自动创建的并且自动附加到任何一个您创建的类或函数对象。这样一个属性是静态的,因为它对于您创建的类或函数来说是特殊的。例如,如果您创建了一个类,那么prototype属性是被所有的类实例所共享的。类实例是没有权利直接访问该属性的。
一个类的prototype对象是该对象的一个特殊的对象,它提供了一个机制用来让所有的该类的对象共享该值。在编译程序的时候,当一个属性不能被在一个类的实例上找到的时候,编译器就会从代理(也就是类的prototype对象)上寻找该属性。如果那个prototype不含有那个属性,那么编译器就会继续从更高级别的类的prototype对象来寻找该属性知道FlashPlayer找到该属性。
注意:在ActionScript3.0中,prototype继承不是先前的那套继承体制。类继承还是保持着以前的那套继承机制。更多的关于类继承的信息。Need XREF to Prog AS3(抱歉了,着实不知道这句话的意思)。
相关查看:
Advanced topics。
(笔者注:所谓prototype,读者可以将其看成是一个在任何类中都存在的一个静态属性,您要访问它必须通过类来直接访问。但是该静态属性又有别于一般的静态属性,它同时可以被当成一个动态的对象来使用,也就是您可以给它任意添加属性。例如,Object.prototype.x=5。)
详细方法
hasOwnProperty()
AS3 函数 hasOwnProperty(name:String):Boolean
判断一个对象是否含有一个指定的属性。如果目标对象含有参数指定的那个属性值,这个方法返回true,否则则返回false。对于某个类的实例对象,下面的这些属性种类返回为true:
1.固定的对象属性——变量(variables),常量(constants),或者该类对象的非静态(static)方法(methods)
2.继承的固定的对象属性——变量,常量,或者继承的非静态方法
3.动态(dynamic)属性——被加到实例对象上的属性(并没有在类里面定义的属性)。要加动态属性,那么定义该实例的类就必须使用dynamic关键字(keyword)申明。
对于某个类的对象的实例,下面的这些属性的种类返回为false。
1.静态属性——变量,常量,或者在类中或任何父类中使用static关键字申明过的方法
2.Prototype属性——定义在对象的原型链(prototype chain)中的原型对象(prototype object)的属性。在ActionScript3.0中,原型链不是用来让类继承的,但是依旧作为一种替换制度的继承形式存在。例如,一个Array class的实例对象可以访问valueOf()方法,因为存在着Object.prototype,它是Array class 原型链中的一部分。尽管您可以在数组实例对象中使用valueOf()方法,但是对于该实例对象,方法hasOwnProperty(“valueOf”)返回false。
ActionScript3.0同时也拥有类对象(class object),它直接代表着类的定义。当您访问一个类对象的时候,hasOwnProperty()方法仅仅在一个属性在类中被定义为静态的时候才返回为true。例如,如果您创建了一个明为CustomArray的Array的子类,并且在CustomArray中定义了一个明为foo的静态属性,那么CustomArray.hasOwnProperty(“foo”)就返回true。然而,对于一个定义在Array里面的静态属性DESCENDING,CustomArray.hasOwnProperty(“foo”)就返回为false了。
注意:通过对象原型链而动态创建的方法,如果要在子类中重新定义这样方法,请不要使用override关键字。例如,一个object的子类执行hasOwnProperty()函数的时候不要使用override。
参数:
name:String ——该对象的属性名称。
返回:
Boolean——如果目标对象存在使用参数name指定的那个属性则返回true,否则则返回false。
AS3函数 isProtypeOf(theClass:Object):Boolean
判断一个实例对象是否在另一个用参数指定的对象的原型链中。该方法在当前对象在指定对象的原型链中的时候就返回为True。该方法在当前对象不在指定的原型拉in中的时候或者指定的对象对象不存在的时候就返回为False。
注意:通过对象原型链而动态创建的方法,要想在它的子类中重新定义该方法,请不要使用override关键字。例如,在Object类的子类中定义isPrototypeOf():Boolean方法的时候,就不要使用override关键字。
参数:theClass:Object——指定的对象所指向的类。
返回:Boolean——当当前对象在指定对象的原型链中的时候就放回true,否则就返回false。
(笔者注:原型链并不是一个好理解的概念,需要读者细心的推敲,很多人编写过很多程序,也都很少用的到的.当然在有些情况下,没这个不行,有机会我讲发表在我的Blog上,告诉读者什么时候非得使用prototype。判断一个对象是否在指定的对象的原型链中,实际上可以理解为指定对象是否是为该对象的类的实例或者是该类的子类的实例。下面的代码创建了一个类,然后判断该类是否为Object的子类:
dynamic public class A
{
}
var myA:A = new A();
trace(A.prototype.isPrototypeOf(myA)) // 输出:true。因为myA是A的实例
trace(Object.prototype.isPrototypeOf(myA)) //输出:true。因为A是Object的子类。)
AS3函数 propertyIsEnumeralbe(name:String):Boolean
判断一个指定的属性是否存在并是否可列举。如果返回为true,那么那个属性一定存在并且可以使用for..in循环来列举出值。该属性必须在指定对象上存在,因为编译器并不会去检查该对象的原型链。
自己创建的属性是可列举的,但是内建的属性是不可举的。
注意:通过对象的原型链而动态创建的方法,要在它的子类中重新定义该方法,请不要使用override关键字。例如,要在一个Object类的子类中重新定义propertyIsEnumerable():Boolean,请不要使用override关键字。
参数:name:String——该对象的属性名称。
返回:Boolean——当指定的属性是可列举的时候就返回true,否则就放回false。
(笔者注:可以看出这样的一些方法都是通过Prototype继承的,所以子类在继承这样一些方法的时候,如果要重新定义这样一些方法,是不需要使用override关键字的,因为编译器搜索该方法的时候是从最底层的类一直往上搜索的。当搜索到的该方法的时候就会停止搜索。这个函数也并不是一个好理解的函数,读者可以看下面的代码来慢慢理解:
dynamic public class A
{
public var _x:uint;
prototype.px = 5;
}
trace(myA.propertyIsEnumerable("_x")); //输出:false,因为该属性是内建属性,并不可举。
trace(myA.propertyIsEnumerable("px")); //输出:false,因为该属性虽然可举,但是是原型链里面的属性,编译器并不知道有该属性。
trace(A.prototype.propertyIsEnumerable("px"));//输出:true,因为该属性是A.prototype对象的属性,并可举。
myA.b = 6;
trace(myA.propertyIsEnumerable("b")); //输出:true,因为该属性是自创建的属性,可举。
for( var i:Object in myA) //输出:px: 5; b: 6,可
{ //以看出px和b都是可举的
trace(i+": "+myA[i]);
} )。
公共函数:setPropertyIsEnumerable(name:String,isEnum:Boolean=true):void
设置动态属性是否为可列举。该属性必须在存在指定对象上,因为这个方法并不会使编译器在原型链中寻找该属性。
参数:name:String—对象属性的名称。
isEnum:Boolean(默认值=true)—如果被设置为false,那么您自己创建 的属性就不会再for..in循环中显示,同时propertyIsEnumerable()就会返回 false.
相关参考:
propertyIsEnumerable();
toString()方法
公共 函数 toString():String
返回代表指定的对象的字符串。
注意:通过原型链动态创建的方法,要想在其子类中重新定义该方法,请不要使用override关键字。例如,在Object类的子类中重写toString():String方法的时候,请不要使用override关键字。
返回:String—一个代表该对象的字符串。
公共 函数 valueOf():Object
public function valueOf():Object
返回该对象的原始值,如果该对象的原始值不存在的话,就返回该对象本身。
注意:通过对象原型链动态创建的方法,要想在子类中重新定义该方法,请不要使用override关键字。例如,在Object类的子类中重写valueOf():Object,请不要使用override关键字。
返回:Object—该对象本身的原始值。
相关参考:
例子:
下面的代码使用了ObjectExample和Circle来演示对象的动态属性的使用,以及如何将对象值转变成Shape对象,然后根据其指定的x/y坐标将其添加到舞台上。
这个例子创建了两个对象,firstInitObj和secondInitObj。然后让自定义类Circle接受了它们的相对应的属性,并添加到舞台上。
package {
import flash.display.Sprite;
public class ObjectExample extends Sprite {
public function ObjectExample() {
var firstInitObj:Object = new Object();
firstInitObj.bgColor = 0xFF0000;
firstInitObj.radius = 25;
firstInitObj.xCenter = 25;
firstInitObj.yCenter = 25;
var firstCircle:Circle = new Circle(firstInitObj);
addChild(firstCircle);
firstCircle.x = 50;
firstCircle.y = 50;
var secondInitObj:Object = {bgColor:0xCCCCCC, radius:50, xCenter:50, yCenter:50};
var secondCircle:Circle = new Circle(secondInitObj);
addChild(secondCircle);
secondCircle.x = 100;
secondCircle.y = 100;
}
}
}
import flash.display.Shape;
class Circle extends Shape {
public var bgColor:Number = 0xFFFFFF;
public var radius:Number = 0;
public var xCenter:Number = 0;
public var yCenter:Number = 0;
public function Circle(initObj:Object) {
for(var i:String in initObj) {
this[i] = initObj[i];
}
draw();
}
public function draw():void {
graphics.beginFill(bgColor);
graphics.drawCircle(xCenter, yCenter, radius);
graphics.endFill();
}
}
Bing
...
2 years ago
着实是不好意思,当时有点一时冲动了,在加上现在的时间一直很紧迫,所以一直没有时间再翻译下去,再加上那个翻译也着实是不是太爽,比看英文要累不少。不过既然开头了,就没有想过要结束它,再等两天我将代号为“ChinaWebCat”开发完后再继续这个的翻译,谢谢您的关注,也很高兴又人需要这个东西!
globle
...
2 years ago
什么时候继续啊!!!
兰亭
...
2 years 2 months ago
很精彩
egoldy
...
2 years 3 months ago
so good!~ :)