很少人知道的AS3 命名空间[转]

http://help.adobe.com/zh_CN/as3/learn/WSf00ab63af761f170-4ed0731912937da73f7-7fe5.html#WSf00ab63af761f170-4ed0731912937da73f7-7fe0

AS3 命名空间

由于存在两种继承机制,即固定属性继承和原型继承,所以涉及到核心类的属性和方法时,就存在两种机制的兼容性问题。如果与 ActionScript 所基于的 ECMAScript 语言规范兼容,则要求使用原型继承,这意味着核心类的属性和方法是在该类的原型对象上定义的。另一方面,如果与 ActionScript 3.0 兼容,则要求使用固定属性继承,这意味着核心类的属性和方法是使用 constvar 和 function 关键字在类定义中定义的。此外,如果使用固定属性而不是原型属性,将显著提升运行时性能。

在 ActionScript 3.0 中,通过同时将原型继承和固定属性继承用于核心类,解决了这个问题。每一个核心类都包含两组属性和方法。一组是在原型对象上定义的,用于与 ECMAScript 规范兼容,另一组使用固定属性定义和 AS3 命名空间定义,以便与 ActionScript 3.0 兼容。

AS3 命名空间提供了一种约定机制,用来在两组属性和方法之间做出选择。如果不使用 AS3 命名空间,核心类的实例会继承在核心类的原型对象上定义的属性和方法。如果决定使用 AS3 命名空间,核心类的实例会继承 AS3 版本,因为固定属性的优先级始终高于原型属性。换句话说,只要固定属性可用,则始终使用固定属性,而不使用同名的原型属性。

通过用 AS3 命名空间限定属性或方法,可以选择使用 AS3 命名空间版本的属性或方法。例如,下面的代码使用 AS3 版本的 Array.pop() 方法:

var nums:Array = new Array(1, 2, 3); 
nums.AS3::pop(); 
trace(nums); // output: 1,2

或者,也可以使用 use namespace 指令打开代码块中所有定义的 AS3 命名空间。例如,以下代码使用 use namespace 指令为 pop() 和 push() 方法打开 AS3 命名空间:

use namespace AS3; 
 
var nums:Array = new Array(1, 2, 3); 
nums.pop(); 
nums.push(5); 
trace(nums) // output: 1,2,5

ActionScript 3.0 还为每组属性提供了编译器选项,以便将 AS3 命名空间应用于整个程序。-as3 编译器选项表示 AS3 命名空间,-es 编译器选项表示原型继承选项(es 代表 ECMAScript)。要打开整个程序的 AS3 命名空间,请将 -as3 编译器选项设置为 true,将 -es 编译器选项设置为 false。要使用原型版本,请将编译器选项设置为相反值。Flash Builder 和 Flash Professional 的默认编译器设置是 -as3 = true-es = false

如果计划扩展任何核心类并覆盖任何方法,应了解 AS3 命名空间对声明覆盖方法的方式有什么影响。如果要使用 AS3 命名空间,覆盖核心类方法的任何方法都必须使用 AS3 命名空间以及 override 属性。如果不打算使用 AS3 命名空间且要重新定义子类中的核心类方法,则不应使用 AS3 命名空间或 override 关键字。

posted @ 2011-07-29 15:33  硕气书生  Views(2184)  Comments(0Edit  收藏  举报