ActionScript 3.0 提供四個特殊的特質,可控制類別之內所定義屬性的存取:public、private、protected 和 internal。
public 特質可讓屬性在您的 Script 中隨處可見。例如,若要讓方法可供套件之外的程式碼使用,您必須以 public 特質宣告該方法。這對任何屬性都成立,不管是使用 var、const 或 function 關鍵字宣告都一樣。
private 特質可以讓一個屬性只有其定義類別的呼叫者可以看見;這種行為方式與 ActionScript 2.0 中的 private 特質不同,在後者中可以讓子類別存取父類別中的私有屬性。另外一項重要的行為方式改變則與執行階段存取有關:在 ActionScript 2.0 中,private 關鍵字只在編譯階段才禁止存取,而在執行階段則很容易規避限制加以運用;在 ActionScript 3.0 中,情形已經改變,標記為 private 的屬性在編譯階段或執行階段都無法使用。
例如,下列程式碼會建立名為 PrivateExample 而有一個私有變數的簡單類別,然後會嘗試從類別之外存取此私有變數。
class PrivateExample
{
private var privVar:String = "private variable";
}
var myExample:PrivateExample = new PrivateExample();
trace(myExample.privVar);// compile-time error in strict mode
trace(myExample["privVar"]); // ActionScript 2.0 allows access, but in ActionScript 3.0, this is a run-time error.
在 ActionScript 3.0 中,若使用嚴謹模式,嘗試使用點運算子 (myExample.privVar) 存取私有屬性會導致編譯階段錯誤;否則,就會在執行階段報告錯誤,跟使用屬性存取運算子 (myExample["privVar"]) 時的情形一樣。
下表摘要列出嘗試存取屬於密封 (而非動態) 類別之私有屬性的結果:
|
嚴謹模式
|
標準模式
|
點運算子 (.)
|
編譯階段錯誤
|
執行階段錯誤
|
方括號運算子 ([])
|
執行階段錯誤
|
執行階段錯誤
|
在以 dynamic 特質宣告的類別中,嘗試存取私有變數並不會產生執行階段錯誤,相反的,變數會看不到,因此傳回 undefined。但是如果在嚴謹模式中使用點運算子,則會發生編譯階段錯誤。下列範例基本上與上一個範例完全相同,只不過 PrivateExample 類別是宣告為動態類別:
dynamic class PrivateExample
{
private var privVar:String = "private variable";
}
var myExample:PrivateExample = new PrivateExample();
trace(myExample.privVar);// compile-time error in strict mode
trace(myExample["privVar"]); // output: 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 中新增的特質,可以讓位於屬性本身套件中的呼叫者看見該屬性。這是套件之內程式碼的預設特質,會套用至沒有下列其它特質的任何屬性:
public
private
protected
使用者定義的命名空間
internal 特質與 Java 中的預設存取控制類似,不過在 Java 中此層級的存取並沒有明確的名稱,而僅能透過省略其它任何存取修飾語來完成這項操作。您可以在 ActionScript 3.0 中使用 internal 特質,讓您能夠選擇明確地表示,是刻意要讓屬性僅供在本身套件之內的呼叫者看見。