ActionScript 3.0 提供了四个特殊的属性来控制对在类中定义的属性的访问:public、private、protected 和 internal。
public 属性使某一属性在脚本的任何位置可见。例如,要使某个方法可用于包外部的代码,必须使用 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"]) 时一样。
下表汇总了试图访问属于密封(非动态)类的 private 属性的结果:
|
严格模式
|
标准模式
|
点运算符 (.)
|
编译时错误
|
运行时错误
|
中括号运算符 ([])
|
运行时错误
|
运行时错误
|
在使用 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
当类外部的代码尝试访问 private 属性时,动态类通常会返回值 undefined,而不是生成错误。下表说明了只有在严格模式下使用点运算符访问 private 属性时才会生成错误:
|
严格模式
|
标准模式
|
点运算符 (.)
|
编译时错误
|
undefined
|
中括号运算符 ([])
|
undefined
|
undefined
|
protected 属性是 ActionScript 3.0 中的新增属性,可使某一属性对于其所属类或子类中的调用方可见。换句话说,protected 属性在其所属类中可用,或者对继承层次中该类下面的类可用。无论子类在同一包中还是在不同包中,这一点都适用。
对熟悉 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 属性旨在为您提供一个明确表达自己意图的选项,以使属性仅对所在包中的调用方可见。