類別 Property 特質

在探討 ActionScript 物件模型中,「屬性」一詞可以代表任何類別的成員,包括變數、常數和方法,與在 ActionScript 3.0 語言和組件參考 中的使用方式不同,後者的用法較為狹窄,而且所包含的類別成員僅為變數或由 getter 或 setter 方法定義的成員。在 ActionScript 3.0 中,有一組特質可配合任何類別的屬性使用,下表列出這組特質的清單。

特質

定義

internal (預設值)

相同套件之內的參考可以看見。

private

相同類別之中的參考可以看見。

protected

相同類別及衍生類別之中的參考可以看見。

public

任何一處的參考都可以看見。

static

指定屬性屬於類別,而不屬於該類別的實體。

UserDefinedNamespace

由使用者定義的自訂命名空間名稱。

副主題

存取控制命名空間特質
static 特質
使用者定義的命名空間特質

存取控制命名空間特質

ActionScript 3.0 提供四個特殊的特質,可控制類別之內所定義屬性的存取:publicprivateprotectedinternal

public 特質可讓屬性在您的 Script 中隨處可見。例如,若要讓方法可供套件之外的程式碼使用,您必須以 public 特質宣告該方法。這對任何屬性都成立,不管是使用 varconstfunction 關鍵字宣告都一樣。

private 特質可以讓一個屬性只有其定義類別的呼叫者可以看見;這種行為方式與 ActionScript 2.0 中的 private 特質不同,在後者中可以讓子類別存取父類別中的私有屬性。另外一項重要的行為方式改變則與執行階段存取有關:在 ActionScript 2.0 中,private 關鍵字只在編譯階段才禁止存取,而在執行階段則很容易規避限制加以運用;在 ActionScript 3.0 中情形已經改變,標記為 private 的屬性在編譯階段或執行階段都無法使用。

例如,下列程式碼會建立名為 PrivateExample 而有一個私有變數的簡單類別,然後會嘗試從類別之外存取此私有變數。在 ActionScript 2.0 中禁止了編譯階段存取,然而卻可以使用屬性存取運算子 ([]),輕易避開禁令,這個運算子會在執行階段而不在編譯階段進行屬性查閱。

class PrivateExample
{
    private var privVar:String = "private variable";
}

var myExample:PrivateExample = new PrivateExample();
trace(myExample.privVar);    // 嚴謹模式中的編譯階段錯誤
trace(myExample["privVar"]); // ActionScript 2.0 允許存取,但在 ActionScript 3.0 中則為執行階段錯誤。 

在 ActionScript 3.0 中,若使用嚴謹模式,嘗試使用點運算子 (myExample.privVar) 存取私有屬性會導致編譯階段錯誤;否則,就會在執行階段報告錯誤,跟使用屬性存取運算子 (myExample["privVar"]) 時的情形一樣。

下表摘要列出嘗試存取屬於密封 (而非動態) 類別之私有屬性的結果:

嚴謹模式

標準模式

點運算子 (.)

編譯階段錯誤

執行階段錯誤

方括號運算子 ([])

執行階段錯誤

執行階段錯誤

在以 dynamic 特質宣告的類別中,嘗試存取私有變數將不會產生執行階段錯誤,而是根本就看不見變數,因此 Flash Player 會傳回值 undefined;但是如果在嚴謹模式中使用點運算子,則會發生編譯階段錯誤。下列範例基本上與上一個範例完全相同,只不過 PrivateExample 類別是宣告為動態類別:

dynamic class PrivateExample
{
    private var privVar:String = "private variable";
}

var myExample:PrivateExample = new PrivateExample();
trace(myExample.privVar);    // 嚴謹模式中的編譯階段錯誤
trace(myExample["privVar"]); // 輸出:undefined

一般來說,類別之外的程式碼嘗試存取私有屬性時,動態類別會傳回值 undefined 而不會產生錯誤。下表顯示,只有使用了點運算子,在嚴謹模式中存取私有屬性時,才會產生錯誤:

嚴謹模式

標準模式

點運算子 (.)

編譯階段錯誤

undefined

方括號運算子 ([])

undefined

undefined

protected 特質是 ActionScript 3.0 中新增的特質,它會讓位於屬性本身所在類別或子類別之中的呼叫者看見該屬性;也就是說,一個保護的屬性是在本身類別之內,或是對於位在其下繼承階層中任何一處的類別,才能使用,不管子類別是位於相同或不同的套件中都一樣。

對於熟悉 ActionScript 2.0 的使用者來說,這項功能類似於 ActionScript 2.0 中的 private 特質。ActionScript 3.0 的 protected 特質也類似於 Java 的 protected 特質,不同之處在於 Java 版本的特質也允許位於相同套件的呼叫者加以存取。當您的子類別需要一個變數或方法,而您要隱藏此變數或方法,不要讓繼承鏈之外的程式碼看見時,protected 特質就很有用。

internal 特質是 ActionScript 3.0 中新增的特質,可以讓位於屬性本身套件中的呼叫者看見該屬性。這是套件之內程式碼的預設特質,會套用至沒有下列其它特質的任何屬性:

internal 特質類似於 Java 中的預設存取控制,不過在 Java 中此層級的存取並沒有明確的名稱,而僅能透過省略其它任何存取修飾語來完成這項操作。您可以在 ActionScript 3.0 中使用 internal 特質,讓您能夠選擇明確地表示,是刻意要讓屬性僅供在本身套件之內的呼叫者看見。

static 特質

static 特質可配合以 varconstfunction 關鍵字宣告的屬性一併使用,讓您將屬性附加至類別,而不是附加至類別的實體。類別外部的程式碼必須使用類別名稱 (而不是使用實體名稱) 呼叫靜態屬性。

靜態屬性並不會由子類別加以繼承,但這種屬性是子類別範圍鏈的一部分;也就是說,在子類別的主體之內,不必參考定義此變數或方法的類別,就可以使用靜態變數或方法。如需詳細資訊,請參閱靜態屬性不繼承

使用者定義的命名空間特質

若不使用預先定義的存取控制特質,另外還有一個方法,就是建立自訂命名空間做為特質使用。每個定義只有一個命名空間特質可用,而且不能結合命名空間特質與任何存取控制特質 (publicprivateprotectedinternal) 同時使用。如需有關使用命名空間的詳細資訊,請參閱命名空間


Flash CS3

 

有新的意見加入至這個頁面時,傳送電子郵件給我 | 意見報告

目前頁面: http://livedocs.adobe.com/flash/9.0_tw/main/00000062.html