Flash CS3 文档 |
|||
| ActionScript 3.0 编程 > ActionScript 中面向对象的编程 > 类 > 类属性 (property) 的属性 (attribute) | |||
讨论 ActionScript 对象模型时,术语“属性”指可以成为类成员的任何成员,包括变量、常量和方法。这与《ActionScript 3.0 语言和组件参考》中该术语的使用方式有所不同,后者中该术语的使用范围更窄,只包括作为变量的类成员或用 getter 或 setter 方法定义的类成员。在 ActionScript 3.0 中,提供了可以与类的任何属性 (property) 一起使用的一组属性 (attribute)。下表列出了这组属性。
|
属性 |
定义 |
|---|---|
|
|
对同一包中的引用可见。 |
|
|
对同一类中的引用可见。 |
|
|
对同一类及派生类中的引用可见。 |
|
|
对所有位置的引用可见。 |
|
|
指定某一属性属于该类,而不属于该类的实例。 |
|
|
用户定义的自定义命名空间名。 |
ActionScript 3.0 提供了四个特殊的属性 (attribute) 来控制对在类中定义的属性 (property) 的访问:public、private、protected 和 internal。
使用 public 属性 (attribute) 可使某一属性 (property) 在脚本的任何位置可见。例如,要使某个方法可用于包外部的代码,必须使用 public 属性声明该方法。这适用于任何属性,不管属性是使用 var、const 还是 function 关键字声明的。
使用 private 属性 (attribute) 可使某一属性 (property) 只对属性 (property) 的定义类中的调用方可见。这一行为不同于 ActionScript 2.0 中 private 属性 (attribute) 的行为,后者允许子类访问超类中的私有属性 (property)。另一处明显的行为变化是必须执行运行时访问。在 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"]) 时一样。
下表汇总了试图访问属于密封(非动态)类的 private 属性的结果:
|
严格模式 |
标准模式 |
|
|---|---|---|
|
点运算符 ( |
编译时错误 |
运行时错误 |
|
中括号运算符 ( |
运行时错误 |
运行时错误 |
在使用 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
当类外部的代码尝试访问 private 属性时,动态类通常会返回值 undefined,而不是生成错误。下表说明了只有在严格模式下使用点运算符访问 private 属性时才会生成错误:
|
严格模式 |
标准模式 |
|
|---|---|---|
|
点运算符 ( |
编译时错误 |
|
|
中括号运算符 ( |
|
|
protected 属性 (attribute) 是 ActionScript 3.0 中的新增属性 (attribute),可使属性 (property) 对所属类或子类中的调用方可见。换句话说,protected 属性在所属类中可用,或者对继承层次结构中该类下面的类可用。无论子类在同一包中还是在不同包中,这一点都适用。
对于熟悉 ActionScript 2.0 的用户而言,此功能类似于 ActionScript 2.0 中的 private 属性。ActionScript 3.0 中的 protected 属性还类似于 Java 中的 protected 属性,不同之处在于,在 Java 版中该属性还允许访问同一包中的调用方。如果存在子类需要的变量或方法,但要对继承链外部的代码隐藏该变量或方法,此时 protected 属性会很有用。
internal 属性 (attribute) 是 ActionScript 3.0 的新增属性 (attribute),可使属性 (property) 对所在包中的调用方可见。该属性是包中代码的默认属性 (attribute),它适用于没有以下任意属性 (attribute) 的任何属性 (property):
public private protected internal 属性与 Java 中的默认访问控制相似,不过,在 Java 中该访问级别没有明确的名称,只能通过省略所有其它访问修饰符来实现。ActionScript 3.0 中提供的 internal 属性 (attribute) 旨在为您提供一个明确表达自己意图的选项,以使属性 (property) 仅对所在包中的调用方可见。
static 属性 (attribute) 可以与用 var、const 或 function 关键字声明的那些属性 (property) 一起使用,使用该属性 (attribute) 可将属性 (property) 附加到类而不是类的实例。类外部的代码必须使用类名(而不是使用实例名)调用静态属性 (property)。
静态属性不由子类继承的,但是这些属性是子类作用域链中的一部分。这意味着在子类体中,不必引用在其中定义静态变量或方法的类,就可以使用静态变量或方法。有关详细信息,请参阅不继承静态属性。
作为预定义访问控制属性的替代方法,您可以创建自定义命名空间以用作属性。每个定义只能使用一个命名空间属性,而且不能将命名空间属性与任何访问控制属性(public、private、protected 和 internal)组合使用。有关使用命名空间的详细信息,请参阅命名空间。
Flash CS3
当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00000062.html