运行时版本: | AIR 1.0 Flash Player 9 |
new
运算符语法创建,并且可以具有动态赋予其的属性。 也可通过赋予对象文字值来创建 Object,如下所示:
var obj:Object = {a:"foo", b:"bar"}
不声明显式基类的所有类均可扩展内置 Object 类。
Adobe Integrated Runtime 中的所有运行时类均可扩展 runtime.Object 类。
可以使用 Object 类创建关联数组。 关键是,关联数组是 Object 类的实例,而每个键/值对由属性及属性的值表示。要将关联数组声明为 Object 数据类型还有另一个原因:您可以使用对象文本来填充关联数组(但只能在您声明它时)。下面的示例使用对象文本创建一个关联数组,使用点运算符和数组访问运算符访问项,然后通过创建一个新属性来添加新的键/值对:
var myAssocArray:Object = {fname:"John", lname:"Public"}; trace(myAssocArray.fname); // John trace(myAssocArray["lname"]); // Public myAssocArray.initial = "Q"; trace(myAssocArray.initial); // Q
ActionScript 3.0 包含两种继承类型:类继承和原型继承:
类继承和原型继承可同时存在,如下例所示:
class A { var x = 1 prototype.px = 2 } dynamic class B extends A { var y = 3 prototype.py = 4 } var b = new B() b.x // 1 via class inheritance b.px // 2 via prototype inheritance from A.prototype b.y // 3 b.py // 4 via prototype inheritance from B.prototype B.prototype.px = 5 b.px // now 5 because B.prototype hides A.prototype b.px = 6 b.px // now 6 because b hides B.prototype
用函数替代类后,可以构造自定义原型继承树。利用类,原型继承树可镜像类继承树。但是,由于原型对象是动态的,因此可以在运行时添加和删除基于原型的属性。
另请参见
属性 | 定义方 | ||
---|---|---|---|
constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | ||
prototype : Object [静态]
对类或函数对象的原型对象的引用。 | Object |
方法 | 定义方 | ||
---|---|---|---|
Object()
创建 Object 对象,并将对该对象的构造函数方法的引用存储在该对象的 constructor 属性中。 | Object | ||
指示对象是否已经定义了指定的属性。 | Object | ||
指示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
指示指定的属性是否存在、是否可枚举。 | Object | ||
设置循环操作动态属性的可用性。 | Object | ||
返回指定对象的字符串表示形式。 | Object | ||
返回指定对象的原始值。 | Object |
constructor | 属性 |
public var constructor:Object
运行时版本: | AIR 1.0 Flash Player 9 |
对类对象或给定对象实例的构造函数的引用。如果某个对象是类的实例,则 constructor
属性具有对该类对象的引用。如果某个对象是使用构造函数创建的,则 constructor
属性具有对该构造函数的引用。切勿将构造函数与类的构造函数方法混同。构造函数是用来创建对象的一种 Function 对象,并且可以代替 class
关键字来定义类。
如果使用 class
关键字定义一个类,则该类的原型对象被赋予名为 constructor
的属性,该属性具有对类对象的引用。该类的实例从原型对象继承该属性。例如,以下代码创建一个新类 A
,以及一个名为 myA
的类实例:
dynamic class A {} trace(A.prototype.constructor); // [class A] trace(A.prototype.constructor == A); // true var myA:A = new A(); trace(myA.constructor == A); // true
高级用户可以选择使用 function
关键字来代替 class
关键字,以定义可用作创建对象的模板的 Function 对象。这种函数称为构造函数,因为将它与 new
运算符结合使用可创建对象。如果使用 function
关键字创建构造函数,其原型对象会被赋予名为 constructor
的属性,该属性具有对构造函数的引用。如果使用构造函数创建一个对象,该对象会从构造函数的原型对象继承 constructor
属性。例如,以下代码创建一个新构造函数 f
,以及一个名为 myF
的对象:
function f() {} trace(f.prototype.constructor); // function Function() {} trace(f.prototype.constructor == f); // true var myF = new f(); trace(myF.constructor == f); // true
注意:constructor
属性是可写的,这意味着用户代码可以通过赋值语句更改其值。不建议更改 constructor
属性的值,但是如果编写的代码依赖 constructor
属性的值,则应确保不重置该值。仅在通过原型对象(例如 className.prototype.constructor
)访问该属性时,才能更改该值。
另请参见
prototype | 属性 |
public static var prototype:Object
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 Flash Player 9 |
对类或函数对象的原型对象的引用。prototype
属性会自动创建并附加到您创建的任何类或函数对象。此属性是静态的,因为它特定于您所创建的类或函数。例如,如果创建了一个类,则 prototype
属性的值由该类的所有实例共享,并且只能将其作为类属性进行访问。该类的实例不能直接访问 prototype
属性。
类的原型对象是一种特殊的类实例,它提供一种在类的所有实例中共享状态的机制。运行时,如果在类实例中找不到某属性,则会检查委托(该类的原型对象)中是否有该属性。如果原型对象中不包含该属性,该过程会继续在层次结构中连续的更高级别上对原型对象进行委托检查,直至 Flash Player 或 Adobe Integrated Runtime 找到该属性为止。
注意:在 ActionScript 3.0 中,原型继承不是主要的继承机制。类继承可驱动类定义中固定属性的继承,它才是 ActionScript 3.0 中主要的继承机制。
另请参见
Object | () | 构造函数 |
public function Object()
创建 Object 对象,并将对该对象的构造函数方法的引用存储在该对象的 constructor
属性中。
另请参见
hasOwnProperty | () | 方法 |
AS3 function hasOwnProperty(name:String):Boolean
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 Flash Player 9 |
指示对象是否已经定义了指定的属性。如果目标对象具有与 name
参数指定的字符串匹配的属性,则此方法返回 true
;否则返回 false
。以下类型的属性导致该方法对属于类实例的对象(而不是类对象)返回 true
:
dynamic
关键字声明对象的定义类。以下类型的属性导致该方法对属于类实例的对象返回 false
:
valueOf()
方法,因为它位于属于 Array 类原型链一部分的 Object.prototype
上。虽然可以在 Array 实例中使用 valueOf()
,但对该实例返回的 hasOwnProperty("valueOf")
值为 false
。ActionScript 3.0 还包含类对象,它是类定义的直接表示形式。调用类对象时,仅当属性是该类对象中定义的静态属性时,hasOwnProperty()
方法才返回 true
。例如,如果创建名为 CustomArray 的 Array 子类,并在 CustomArray 中定义一个名为 foo
的静态属性,对 CustomArray.hasOwnProperty("foo")
的调用则返回 true
。然而,对于在 Array 类中定义的静态属性 DESCENDING
,对 CustomArray.hasOwnProperty("DESCENDING")
的调用返回 false
。
注意:Object 类的方法是在 Object 的原型上动态创建的。要在 Object 的子类中重新定义该方法,请不要使用 override
关键字。例如,Object 的一个子类实现 function hasOwnProperty():Boolean
而不使用基类覆盖。
参数
name:String — 对象的属性。
|
Boolean — 如果目标对象具有 name 参数指定的属性,则该值为 true ;否则为 false 。
|
isPrototypeOf | () | 方法 |
AS3 function isPrototypeOf(theClass:Object):Boolean
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 Flash Player 9 |
指示 Object 类的实例是否在指定为参数的对象的原型链中。如果该对象位于由 theClass
参数指定的对象的原型链中,则此方法返回 true
。如果 theClass
对象的原型链中缺少目标对象,并且 theClass
参数不为对象,则该方法返回 false
。
注意:Object 类的方法是在 Object 的原型上动态创建的。要在 Object 的子类中重新定义该方法,请不要使用 override
关键字。例如,Object 的一个子类实现 function isPrototypeOf():Boolean
而不使用基类覆盖。
参数
theClass:Object — 指定对象可能引用的类。
|
Boolean — 如果对象位于由 theClass 参数指定的对象的原型链中,则该值为 true ,否则为 false 。
|
propertyIsEnumerable | () | 方法 |
AS3 function propertyIsEnumerable(name:String):Boolean
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 Flash Player 9 |
指示指定的属性是否存在、是否可枚举。如果为 true
,则该属性存在并且可以在 for..in
循环中枚举。该属性必须存在于目标对象上,原因是:该方法不检查目标对象的原型链。
您创建的属性是可枚举的,但是内置属性通常是不可枚举的。
注意:Object 类的方法是在 Object 的原型上动态创建的。要在 Object 的子类中重新定义该方法,请不要使用 override
关键字。例如,Object 的一个子类实现 function propertyIsEnumerable():Boolean
而不使用基类覆盖。
参数
name:String — 对象的属性。
|
Boolean — 如果 name 参数指定的属性可以枚举,则该值为 true ,否则为 false 。
|
setPropertyIsEnumerable | () | 方法 |
public function setPropertyIsEnumerable(name:String, isEnum:Boolean = true):void
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0 Flash Player 9 |
设置循环操作动态属性的可用性。该属性必须存在于目标对象上,原因是:该方法不检查目标对象的原型链。
参数
name:String — 对象的属性。
| |
isEnum:Boolean (default = true ) — 如果设置为 false ,则动态属性不会显示在 for..in 循环中,且方法 propertyIsEnumerable() 返回 false 。
|
另请参见
toString | () | 方法 |
public function toString():String
运行时版本: | AIR 1.0 Flash Player 9 |
返回指定对象的字符串表示形式。
注意:Object 类的方法是在 Object 的原型上动态创建的。要在 Object 的子类中重新定义该方法,请不要使用 override
关键字。例如,Object 的一个子类实现 function toString():String
而不使用基类覆盖。
String — 对象的字符串表示形式。
|
valueOf | () | 方法 |
public function valueOf():Object
运行时版本: | AIR 1.0 Flash Player 9 |
返回指定对象的原始值。如果此对象没有原始值,则返回对象本身。
注意:Object 类的方法是在 Object 的原型上动态创建的。要在 Object 的子类中重新定义该方法,请不要使用 override
关键字。例如,Object 的一个子类实现 function valueOf():Object
而不使用基类覆盖。
Object — 该对象的原始值或对象本身。
|
另请参见
ObjectExample
和 Circle
来证实 Object 类的动态性质,以及值对象如何转换为 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(); } }