当前位置: 首页 > 图文教程 > Flash动画 > ActionScript > Flash AS3教程:类属性的属性

ActionScript
ActionScript3教程:语句实例
ActionScipt技巧和开发中会遇到的问题
Flash as3.0教程:弹性小球
flash as简单制作飘雪动画
Flash AS 教程:交互动画
Flash ActionScript 3.0教程:学习Dot类
Flash AS 教程:子类化显示对象
Flash AS 教程:动画事件
Flash AS 教程:创建文档类(Document class)
Flash AS 教程:帧循环
Flash AS 教程:类和面向对象编程
Flash AS 教程:构造函数(Constructor)
Flex程序开发心得小结
Flash游戏开发教程:第一节
FLASH中的元件能在Flex中完美使用
关于XML在FLASH中的应用
Flash AS教程:decorator Pattern
Flash AS实例教程:简单的loading
Flash教程:彻底学习RadioButton组件
Flash AS教程:复制粘贴类

ActionScript 中的 Flash AS3教程:类属性的属性


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-30   浏览: 297 ::
收藏到网摘: n/a

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

属性

定义

internal(默认)

对同一包中的引用可见。

private

对同一类中的引用可见。

protected

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

public

对所有位置的引用可见。

static

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

UserDefinedNamespace

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

访问控制命名空间属性

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);// 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 属性声明的类中尝试访问私有变量时,不会导致运行时错误。只是变量不可见,所以 Flash Player or Adobe® AIR™ 返回值 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 属性 (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 属性

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

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

用户定义的命名空间属性

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