类属性 (property) 的属性 (attribute)

讨论 ActionScript 对象模型时,术语“属性”指可以成为类成员的任何成员,包括变量、常量和方法。这与《ActionScript 3.0 语言和组件参考》中该术语的使用方式有所不同,后者中该术语的使用范围更窄,只包括作为变量的类成员或用 getter 或 setter 方法定义的类成员。在 ActionScript 3.0 中,提供了可以与类的任何属性 (property) 一起使用的一组属性 (attribute)。下表列出了这组属性。

属性

定义

internal(默认)

对同一包中的引用可见。

private

对同一类中的引用可见。

protected

对同一类及派生类中的引用可见。

public

对所有位置的引用可见。

static

指定某一属性属于该类,而不属于该类的实例。

UserDefinedNamespace

用户定义的自定义命名空间名。

子主题

访问控制命名空间属性
static 属性
用户定义的命名空间属性

访问控制命名空间属性

ActionScript 3.0 提供了四个特殊的属性 (attribute) 来控制对在类中定义的属性 (property) 的访问:publicprivateprotectedinternal

使用 public 属性 (attribute) 可使某一属性 (property) 在脚本的任何位置可见。例如,要使某个方法可用于包外部的代码,必须使用 public 属性声明该方法。这适用于任何属性,不管属性是使用 varconst 还是 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 属性时才会生成错误:

严格模式

标准模式

点运算符 (.)

编译时错误

undefined

中括号运算符 ([])

undefined

undefined

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):

internal 属性与 Java 中的默认访问控制相似,不过,在 Java 中该访问级别没有明确的名称,只能通过省略所有其它访问修饰符来实现。ActionScript 3.0 中提供的 internal 属性 (attribute) 旨在为您提供一个明确表达自己意图的选项,以使属性 (property) 仅对所在包中的调用方可见。

static 属性

static 属性 (attribute) 可以与用 varconstfunction 关键字声明的那些属性 (property) 一起使用,使用该属性 (attribute) 可将属性 (property) 附加到类而不是类的实例。类外部的代码必须使用类名(而不是使用实例名)调用静态属性 (property)。

静态属性不由子类继承的,但是这些属性是子类作用域链中的一部分。这意味着在子类体中,不必引用在其中定义静态变量或方法的类,就可以使用静态变量或方法。有关详细信息,请参阅不继承静态属性

用户定义的命名空间属性

作为预定义访问控制属性的替代方法,您可以创建自定义命名空间以用作属性。每个定义只能使用一个命名空间属性,而且不能将命名空间属性与任何访问控制属性(publicprivateprotectedinternal)组合使用。有关使用命名空间的详细信息,请参阅命名空间


Flash CS3

 

评论添加到页面后给我发送电子邮件 | 评论报告

当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00000062.html