针对 JavaScript 开发人员的 ActionScript 基础知识

Adobe® ActionScript® 3.0 是一种与 JavaScript 类似的编程语言,它们均基于 ECMAScript。ActionScript 3.0 是随 Adobe® Flash® Player 9 一起发布的,因此您可以使用它在 Adobe® Flash® CS3 Professional、Adobe® Flash® CS4 Professional 和 Adobe® Flex™ 3 中开发富 Internet 应用程序。

仅当为浏览器中的 Flash Player 9 开发 SWF 内容时,当前版本的 ActionScript 3.0 才可用。目前,它还可用于开发在 Adobe® AIR® 中运行的 SWF 内容。

针对 HTML 开发人员的 Adobe AIR API 参考 中提供了这些在基于 HTML 的应用程序的 JavaScript 代码中非常有用的类的文档。这些类只是运行时中整个类集中的一部分。运行时中的其他类在开发基于 SWF 的应用程序时非常有用(例如,DisplayObject 类可以定义可视内容的结构)。如果您需要在 JavaScript 中使用这些类,请参阅以下 ActionScript 文档:

ActionScript 和 JavaScript 之间的差异:概述

与 JavaScript 类似,ActionScript 也基于 ECMAScript 语言规范;因此这两种语言包含公用的核心语法。例如,以下代码在 JavaScript 和 ActionScript 中的功能是一样的:

var str1 = "hello"; 
var str2 = " world."; 
var str = reverseString(str1 + str2); 
     
function reverseString(s) { 
    var newString = ""; 
    var i; 
    for (i = s.length - 1; i >= 0; i--) { 
        newString += s.charAt(i); 
    } 
    return newString; 
}

不过,这两种语言在语法和工作方式上存在差异。例如,如果使用 ActionScript 3.0,则前面的代码示例可以写成如下形式(在 SWF 文件中):

function reverseString(s:String):String { 
    var newString:String = ""; 
    for (var i:int = s.length - 1; i >= 0; i--) { 
        newString += s.charAt(i); 
    } 
    return newString; 
}

Adobe AIR 中的 HTML 内容所支持的 JavaScript 版本为 JavaScript 1.7。本主题介绍了 JavaScript 1.7 和 ActionScript 3.0 之间的差异。

运行时包括一些可提供高级功能的内置类。在运行时,HTML 页中的 JavaScript 可以访问这些类。相同的运行时类既可用于 ActionScript(在 SWF 文件中),也可用于 JavaScript(在浏览器上运行的 HTML 文件中)。但是,当前有关这些类(未包含在 针对 HTML 开发人员的 Adobe AIR API 参考 中)的 API 文档使用 ActionScript 语法描述它们。换句话说,有关运行时的某些高级功能,请参阅 用于 Adobe Flash Platform 的 ActionScript 3.0 参考 。了解 ActionScript 的基础知识有助于您了解如何在 JavaScript 中使用这些运行时类。

例如,以下 JavaScript 代码可播放 MP3 文件的声音:

var file = air.File.userDirectory.resolve("My Music/test.mp3"); 
var sound = air.Sound(file); 
sound.play();

基中每个代码行通过 JavaScript 调用运行时功能。

在 SWF 文件中,ActionScript 代码可以访问这些运行时功能,如下面的代码所示:

var file:File = File.userDirectory.resolve("My Music/test.mp3"); 
var sound = new Sound(file); 
sound.play();

ActionScript 3.0 数据类型

ActionScript 3.0 是一种 强类型 语言。这意味着您可以为变量指定数据类型。例如,前面示例中的第一行可以写成如下形式:

var str1:String = "hello";

其中 str1 变量被声明为 String 类型。针对 str1 变量的所有后续赋值都将向该变量赋予 String 值。

您可以为变量、函数参数和函数返回类型指定类型。因此,前面示例中的函数声明在 ActionScript 中将如下所示:

function reverseString(s:String):String { 
       var newString:String = ""; 
       for (var i:int = s.length - 1; i >= 0; i--) { 
           newString += s.charAt(i); 
       } 
       return newString; 
}
注: s 参数和该函数的返回值都被赋予了 String 类型。

尽管指定类型在 ActionScript 中是一项可选操作,但声明对象类型具有以下优势:

  • 对于指定了类型的对象,不仅可以在运行时检查数据类型,而且还可以在编译时检查数据类型(只要您使用的是严格模式)。在编译时进行类型检查有助于识别错误。(严格模式属于编译器选项。)

  • 使用具有类型的对象可创建更有效的应用程序。

    为此,ActionScript 文档中的示例将使用数据类型。通常,只要删除类型声明(如“ :String ”),就可以将示例 ActionScript 代码转换为 JavaScript。

与自定义类相对应的数据类型

ActionScript 3.0 对象可以具有与顶级类相对应的数据类型,如 String、Number 或 Date。

在 ActionScript 3.0 中,您可以定义自定义类。每个自定义类同样定义一个数据类型。这意味着 ActionScript 变量、函数参数或函数返回值可以具有由该类定义的类型注释。有关详细信息,请参阅 ActionScript 3.0 自定义类

void 数据类型

void 数据类型将用作函数的返回值,实际上该函数不返回任何值。(不包含 return 语句的函数不会返回值。)

* 数据类型

将星号字符 (*) 用作数据类型等同于未指定数据类型。例如,以下函数包括参数 n 和返回值,二者均未指定数据类型:

function exampleFunction(n:*):* { 
       trace("hi, " + n); 
}

将 * 用作数据类型表示根本没有定义数据类型。如果在 ActionScript 3.0 代码中使用星号,则表明未定义任何数据类型。

ActionScript 3.0 类、包和命名空间

ActionScript 3.0 包含 JavaScript 1.7 中所没有的类的相关功能。

运行时类

运行时包括内置类,其中许多内置类也包含在标准 JavaScript 中,如 Array、Date、Math 和 String 类(以及其他类)。但是,运行时还包含标准 JavaScript 中未找到的类。这些附加的类具有从播放丰富媒体(例如声音)到与套接字交互的不同用途。

大多数运行时类包含在 flash 包中,或者包含在 flash 包内的某个包中。包是用来组织 ActionScript 3.0 类的一种方式(请参阅 ActionScript 3.0 包

ActionScript 3.0 自定义类

开发人员可通过 ActionScript 3.0 创建他们自己的自定义类。例如,以下代码定义了名为 ExampleClass 的自定义类:

public class ExampleClass { 
    public var x:Number; 
    public function ExampleClass(input:Number):void { 
        x = input; 
    } 
    public function greet():void { 
        trace("The value of x is: ", x); 
    } 
}

此类具有以下成员:

  • 构造函数方法 ExampleClass() ,可用于实例化 ExampleClass 类型的新对象。

  • 公共属性 x (为 Number 类型),可以为 ExampleClass 类型的对象获取和设置该属性。

  • 公共方法 greet() ,可以对 ExampleClass 类型的对象调用该方法。

    在此示例中, x 属性和 greet() 方法在 public 命名空间中。使用 public 命名空间可从该类以外的对象和类访问方法和属性。

ActionScript 3.0 包

包提供了用来组织 ActionScript 3.0 类的方法。例如,许多与使用计算机上的文件和目录相关的类均包含在 flash.filesystem 包中。此时,flash 包中包含了另一个包 filesystem。该包可能包含其他类或包。实际上,flash.filesystem 包中包含以下类:File、FileMode 和 FileStream。若要引用 ActionScript 中的 File 类,可以编写以下代码:

flash.filesystem.File

可以在包中同时包含内置类和自定义类。

当从 JavaScript 中引用 ActionScript 包时,请使用特殊的 runtime 对象。例如,以下代码将在 JavaScript 中对新的 ActionScript File 对象进行实例化:

var myFile = new air.flash.filesystem.File();

在此处, File() 方法是与具有相同名称 (File) 的类相对应的构造函数。

ActionScript 3.0 命名空间

在 ActionScript 3.0 中,命名空间定义类中可以访问的属性和函数的范围。

只有那些 public 命名空间中的属性和方法在 JavaScript 中可用。

例如,File 类(在 flash.filesystem 包中)包括 public 属性和方法,如 userDirectory resolve() 。二者均以 JavaScript 变量的属性的形式提供,该变量可实例化 File 对象(通过 runtime.flash.filesystem.File() 构造函数方法)。

有四种预定义的命名空间:

命名空间

说明

public

任何用于实例化特定类型对象的代码都可以访问用来定义该类型的类的公共属性和方法。此外,任何代码都可以访问公共类的公共静态属性和方法。

private

指定为 private 的属性和方法仅可用于该类中的代码。它们不能作为该类定义的对象的属性或方法进行访问。private 命名空间中的属性和方法在 JavaScript 中不可用。

protected

指定为 protected 的属性和方法仅可用于类定义中的代码和继承该类的类。protected 命名空间中的属性和方法在 JavaScript 中不可用。

internal

指定为 internal 的属性和方法可用于同一包中的任意调用者。默认情况下,类、属性和方法属于 internal 命名空间。

另外,自定义类可以使用不可用于 JavaScript 代码的其他命名空间。

ActionScript 3.0 函数中的必需参数和默认值

在 ActionScript 3.0 和 JavaScript 中,函数可以包括参数。在 ActionScript 3.0 中,参数可以是必需参数,也可以是可选参数;而在 JavaScript 中,参数始终是可选参数。

以下 ActionScript 3.0 代码定义了一个函数,其中的一个参数 n 是必需参数:

function cube(n:Number):Number { 
    return n*n*n; 
}

以下 ActionScript 3.0 代码定义了一个要求 n 参数的函数。它还包含可选的 p 参数,其默认值为 1:

function root(n:Number, p:Number = 1):Number { 
    return Math.pow(n, 1/p); 
}

ActionScript 3.0 函数还可以接收任意数量的参数,这些参数通过在参数列表的结尾处使用 ...rest 语法来表示,如下所示:

function average(... args) : Number{ 
    var sum:Number = 0; 
    for (var i:int = 0; i < args.length; i++) { 
        sum += args[i]; 
    } 
    return (sum / args.length); 
}

ActionScript 3.0 事件侦听器

在 ActionScript 3.0 编程中,将使用 事件侦听器 处理所有事件。事件侦听器是一个函数。当对象调度事件时,事件侦听器将响应该事件。将 ActionScript 对象事件作为函数参数传递给事件侦听器。此事件对象的使用与 JavaScript 中使用的 DOM 事件模型不同。

例如,当您调用 Sound 对象的 load() 方法(加载一个 MP3 文件)时,Sound 对象将尝试加载声音。然后,Sound 对象将调度下列任一事件:

事件

说明

complete

成功加载数据后调度。

id3

MP3 ID3 数据可用时调度。

ioError

在出现输入/输出错误并由此导致加载操作失败时调度。

open

在加载操作开始时调度。

progress

在加载操作进行过程中接收到数据时调度。

任何可以调度事件的类可扩展 EventDispatcher 类或实现 IEventDispatcher 接口。(ActionScript 3.0 接口是用于定义类可实现的一系列方法的数据类型。)在 ActionScript 语言参考中,针对这些类的每个类列表中都包含一组该类可以调度的事件。

您可以注册事件侦听器函数,以使用调度该事件的对象的 addEventListener() 方法处理任何事件。例如,就 Sound 对象来说,您可以注册 progress complete 事件,如以下 ActionScript 代码所示:

var sound:Sound = new Sound(); 
var urlReq:URLRequest = new URLRequest("test.mp3"); 
sound.load(urlReq); 
sound.addEventListener(ProgressEvent.PROGRESS, progressHandler); 
sound.addEventListener(Event.COMPLETE, completeHandler); 
 
function progressHandler(progressEvent):void { 
      trace("Progress " + progressEvent.bytesTotal + " bytes out of " + progressEvent.bytesTotal); 
} 
 
function completeHandler(completeEvent):void { 
      trace("Sound loaded."); 
}

在 AIR 中运行的 HTML 内容中,您可以将 JavaScript 函数注册为事件侦听器。以下代码对此进行了说明。(此代码假定 HTML 文档包含名为 progressTextArea 的 TextArea 对象。)

var sound = new runtime.flash.media.Sound(); 
var urlReq = new runtime.flash.net.URLRequest("test.mp3"); 
sound.load(urlReq); 
sound.addEventListener(runtime.flash.events.ProgressEvent.PROGRESS, progressHandler); 
sound.addEventListener(runtime.flash.events.Event.COMPLETE, completeHandler); 
 
function progressHandler(progressEvent) { 
      document.progressTextArea.value += "Progress " + progressEvent.bytesTotal + " bytes out of " + progressEvent.bytesTotal; 
} 
 
function completeHandler(completeEvent) { 
      document.progressTextArea.value += "Sound loaded.";