執行階段版本: | Flash Player 9, AIR 1.0, Flash Lite 4 |
new
運算子語法所建立,可以對其動態指定屬性。 以指派物件常值的方式也可以建立物件,如下所示:
var obj:Object = {a:"foo", b:"bar"}
沒有宣告明確基底類別的所有類別都會擴充內建的 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 具有兩種繼承類型: 類別繼承與原型繼承:
- 類別繼承:是主要的繼承機制,並支援固定屬性的繼承。 固定的屬性是宣告為類別定義一部分的變數、常數或方法。 現在每項類別定義都由特殊的類別物件所代表,這些物件儲存著關於該類別的資訊。
- 原型繼承:是先前版本 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 屬性取決於原型物件 (它是一個執行階段實體),所以在編譯階段會發生錯誤。如果您使用標準模式或者類別描述指定了「動態」,程式碼就會執行而且不會發生錯誤。
相關 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
:
- 靜態屬性:以 static 關鍵字在物件的定義類別或其任何的父類別中定義的變數、常數或方法;
- 原型屬性:在屬於物件原型鏈一部分之原型物件上定義的屬性。 在 ActionScript 3.0 中,原型鏈並不會使用於類別繼承,不過原型鏈依然是替代的繼承形式。 例如,Array 類別的實體可以存取
valueOf()
方法,因為該方法存在於Object.prototype
,也就是 Array 類別之原型鏈的一部分。 雖然您可以在 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
物件的原型鏈中沒有目標物件,這個方法就會傳回 false
,而且如果 theClass
參數不是物件,也會傳回相同結果。
注意: 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, 03:47 PM Z