运行时版本: | Flash Player 9, AIR 1.0, Flash Lite 4 |
new
运算符语法创建,并且可以具有动态赋予其的属性。也可通过赋予对象文字值来创建 Object,如下所示:
var obj:Object = {a:"foo", b:"bar"}
不声明显式基类的所有类均可扩展内置 Object 类。
可以使用 Object 类创建关联数组。关键是,关联数组是 Object 类的实例,而每个键/值对由属性及属性的值表示。要将关联数组声明为 Object 数据类型还有另一个原因:您可以使用对象文本来填充关联数组(但只能在您声明它时)。下面的示例使用对象文本创建一个关联数组,使用 dot 运算符和 array access 运算符访问项,然后通过创建一个新属性来添加新的键/值对:
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 包含两种继承类型:类继承和原型继承:
- 类继承 -- 是主要的继承机制,并支持固定属性的继承。固定属性是声明为类定义一部分的变量、常量或方法。现在,可通过存储相关类信息的特殊类对象表示每个类定义。
- 原型继承 -- 在以前版本的 ActionScript 中是唯一的继承机制,在 ActionScript 3.0 中作为继承的替代形式。每种类都有一个关联的原型对象,而原型对象的属性由该类的所有实例共享。在创建一个类实例时,它具有对其类的原型对象的引用,这将作为实例及与其关联的类原型对象间的链接。运行时,如果在类实例中找不到某属性,则会检查委托(该类的原型对象)中是否有该属性。如果原型对象不包含这种属性,此过程会继续在层次结构中连续的更高级别上对原型对象进行委托检查,直到 Flash 运行找到该属性为止。
类继承和原型继承可同时存在,如下例所示:
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
用函数替代类后,可以构造自定义原型继承树。利用类,原型继承树可镜像类继承树。但是,由于原型对象是动态的,因此可以在运行时添加和删除基于原型的属性。
相关 API 元素
属性 | 由以下参数定义 | ||
---|---|---|---|
constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | ||
prototype : Object [静态]
对类或函数对象的原型对象的引用。 | Object |
方法 | 由以下参数定义 | ||
---|---|---|---|
Object()
创建 Object 对象,并将对该对象的构造函数方法的引用存储在该对象的 constructor 属性中。 | Object | ||
表示对象是否已经定义了指定的属性。 | Object | ||
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
表示指定的属性是否存在、是否可枚举。 | Object | ||
设置循环操作动态属性的可用性。 | Object | ||
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。 | Object | ||
返回指定对象的字符串表示形式。 | Object | ||
返回指定对象的原始值。 | Object |
constructor | 属性 |
public var constructor:Object
运行时版本: | Flash Player 9, Flash Lite 4, Flash Player 9, AIR 1.0 |
对类对象或给定对象实例的构造函数的引用。如果某个对象是类的实例,则 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
)访问该属性时,才能更改该值。
如果访问 constructor
属性,并以严谨模式编译,那么编译时将出错,因为 constructor 属性依赖于原型对象,而原型对象是运行时实体。如果使用标准模式,或者类描述指定了“dynamic”,则代码运行时不会产生错误。
相关 API 元素
prototype | 属性 |
public static var prototype:Object
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 9, AIR 1.0, Flash Lite 4 |
对类或函数对象的原型对象的引用。prototype
属性会自动创建并附加到您创建的任何类或函数对象。此属性是静态的,因为它特定于您所创建的类或函数。例如,如果创建了一个类,则 prototype
属性的值由该类的所有实例共享,并且只能将其作为类属性进行访问。该类的实例不能直接访问 prototype
属性。
类的原型对象是一种特殊的类实例,它提供一种在类的所有实例中共享状态的机制。运行时,如果在类实例中找不到某属性,则会检查委托(该类的原型对象)中是否有该属性。如果原型对象不包含这种属性,此过程会继续在层次结构中连续的更高级别上对原型对象进行委托检查,直到 Flash 运行找到该属性为止。
注意:在 ActionScript 3.0 中,原型继承不是主要的继承机制。类继承可驱动类定义中固定属性的继承,它才是 ActionScript 3.0 中主要的继承机制。
Object | () | 构造函数 |
public function Object()
运行时版本: | Flash Player 9, AIR 1.0, Flash Lite 4 |
创建 Object 对象,并将对该对象的构造函数方法的引用存储在该对象的 constructor
属性中。
hasOwnProperty | () | 方法 |
AS3 function hasOwnProperty(name:String):Boolean
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 9, AIR 1.0, Flash Lite 4 |
表示对象是否已经定义了指定的属性。如果目标对象具有与 name
参数指定的字符串匹配的属性,则此方法返回 true
;否则返回 false
。以下类型的属性导致该方法对属于类实例的对象(而不是类对象)返回 true
:
- 固定实例属性 — 对象类定义的非静态变量、常量或方法;
- 继承的固定实例属性 — 对象类继承的变量、常量或方法;
- 动态属性 — 对象实例化后添加到其中的属性(在其类定义之外)。要添加动态属性,必须用
dynamic
关键字声明对象的定义类。
以下类型的属性导致该方法对属于类实例的对象返回 false
:
- 静态属性 -- 在对象的定义类或其任何超类中使用静态关键字定义的变量、常量或方法;
- 原型属性 -- 在原型对象上定义的属于对象原型链一部分的属性。在 ActionScript 3.0 中,虽然原型链不用于类继承,但仍可作为继承的一种替代形式存在。例如,Array 类的一个实例可以访问
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 |
运行时版本: | Flash Player 9, AIR 1.0, Flash Lite 4 |
表示 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 |
运行时版本: | Flash Player 9, AIR 1.0, Flash Lite 4 |
表示指定的属性是否存在、是否可枚举。如果为 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 |
运行时版本: | Flash Player 9, AIR 1.0, Flash Lite 4 |
设置循环操作动态属性的可用性。该属性必须存在于目标对象上,原因是:该方法不检查目标对象的原型链。
参数
name:String — 对象的属性。
| |
isEnum:Boolean (default = true ) — 如果设置为 false ,则动态属性不会显示在 for..in 循环中,且方法 propertyIsEnumerable() 返回 false 。
|
相关 API 元素
toLocaleString | () | 方法 |
public function toLocaleString():String
语言版本: | ActionScript 3.0 |
运行时版本: | Flash Player 9, AIR 1.0, Flash Lite 4 |
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。
此方法的默认实现不执行区域设置特定的格式设置,并返回与 toString()
相同的字符串。子类应在适当时提供它们自己的识别区域设置的实现。
注意:Object 类的方法是在 Object 的原型上动态创建的。要在 Object 的子类中重新定义该方法,请不要使用 override
关键字。例如,Object 的一个子类实现 function toLocaleString():String
,而不使用基类覆盖。
String — 此对象的字符串表示形式,其格式设置遵守本地约定。
|
相关 API 元素
toString | () | 方法 |
valueOf | () | 方法 |
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(); } }
Tue Jun 12 2018, 11:04 AM Z