使用对象

ActionScript 是一种面向对象的编程语言。面向对象的编程只是一种编程方法。组织程序中代码的方法确实只有一种,即使用对象。

术语“计算机程序”早些时候定义为计算机执行的一系列步骤或指令。所以,从概念上讲,您可以认为计算机程序就是一个很长的指令列表。然而,在面向对象的编程中,程序指令分布在不同对象中。代码被编组为功能区块,因此相关的功能类型或相关的各条信息被编组到一个容器中。

Adobe Flash Professional

如果您已在 Flash Professional 中使用过元件,就应该已习惯使用对象了。假定您定义了一个影片剪辑元件(例如矩形绘制),并已在舞台上放置了其副本。从严格意义上来说,该影片剪辑元件也是 ActionScript 中的一个对象;即 MovieClip 类的一个实例。

您可以修改该影片剪辑的不同特征。选择该影片剪辑元件后,您可以在属性检查器中更改值(如元件的 X 坐标或宽度)。您还可以进行各种颜色调整,例如更改其 Alpha(透明度)或对其应用投影滤镜。还可以使用其它 Flash Professional 工具进行更多更改,例如,使用自由变换工具旋转矩形。Flash Professional 中可用于修改影片剪辑元件的所有这些方法,在 ActionScript 中也提供。通过更改合在一起组成称为 MovieClip 对象的单一绑定的各种数据,可以在 ActionScript 中修改影片剪辑。

在 ActionScript 面向对象的编程中,任何类都可以包含三种类型的特性:

  • 属性

  • 方法

  • 事件

这些元素用于管理程序使用的各种数据并决定执行哪些操作及执行顺序。

属性

属性表示某个对象中绑定在一起的若干数据块中的一个。例如,song 对象可以包含名为 artisttitle 的属性;MovieClip 类具有 rotationXwidthalpha 等属性。您可以像使用各变量那样使用属性。事实上,您可以简单地将属性视为包含于对象中的“子”变量。

以下是一些使用属性的 ActionScript 代码的示例。以下代码行将名为 square 的 MovieClip 移动到 100 个像素的 x 坐标处:

square.x = 100;

此代码使用 rotation 属性旋转 square MovieClip,以便与 triangle MovieClip 的旋转相匹配:

square.rotation = triangle.rotation;

此代码改变了 square MovieClip 的水平缩放,使其宽度变为之前的 1.5 倍:

square.scaleX = 1.5;

请注意上面几个示例的通用结构:将变量(squaretriangle)用作对象的名称,后跟一个句点 (.) 和属性名(xrotationscaleX)。句点称为点运算符,用于指示您要访问对象的某个子元素。整个结构“变量名-点-属性名”的使用类似于单个变量,作为计算机内存中的单个值的名称。

方法

方法是对象可执行的动作。例如,假设您在 Flash Professional 中的时间轴上创建了带有多个关键帧和动画的影片剪辑元件。影片剪辑可以播放、停止或根据命令将播放头移动到特定帧。

下面的代码指示名为 shortFilm 的 MovieClip 开始播放:

shortFilm.play();

下面的代码行使名为 shortFilm 的 MovieClip 停止播放(播放头停在原地,就像暂停播放视频一样):

shortFilm.stop();

下面的代码使名为 shortFilm 的 MovieClip 将其播放头移到第 1 帧,然后停止播放(就像后退视频一样):

shortFilm.gotoAndStop(1);

您可以通过依次写下对象名(变量)、句点、方法名和小括号来访问方法,这与属性类似。小括号用于指示要调用方法(即指示对象执行该操作)。有时,为了传递执行动作所必需的额外信息,也将值(或变量)放入小括号中。这些值称为方法参数。例如,gotoAndStop() 方法需要关于转到哪一帧的信息,所以要求小括号中有一个参数。有些方法(如 play()stop())自身的意义已非常明确,因此不需要额外信息。但书写时仍然带有小括号。

与属性(和变量)不同的是,方法不能用作值占位符。然而,一些方法可以执行计算并返回可以像变量一样使用的结果。例如,Number 类的 toString() 方法将数值转换为文本表示形式:

var numericData:Number = 9; 
var textData:String = numericData.toString();

例如,如果希望在屏幕上的文本字段中显示 Number 变量的值,应使用 toString() 方法。TextField 类的 text 属性定义为 String,因此只能包含文本值。(文本 property 表示屏幕上显示的实际文本内容。)此行代码将变量 numericData 中的数值转换为文本。然后,使该值显示在屏幕上名为 calculatorDisplay 的 TextField 对象中:

calculatorDisplay.text = numericData.toString();

事件

计算机程序就是计算机分步执行的一系列指令。一些简单的计算机程序仅包括计算机要执行的几个步骤以及程序的结束点。然而,ActionScript 程序可以保持运行、等待用户输入或等待其它事件发生。事件是确定计算机执行哪些指令以及何时执行的机制。

本质上,事件就是所发生的、ActionScript 能够识别并可响应的事情。许多事件与用户交互相关联,诸如用户单击某个按钮或按键盘上的某个键之类。还有其它类型的事件。例如,如果您使用 ActionScript 加载外部图像,有一个事件可以让您知道图像何时加载完毕。当 ActionScript 程序运行时,从概念上讲,它只是坐等某些事情发生。发生这些事情时,为这些事件指定的特定 ActionScript 代码将运行。

基本事件处理

用于指定为响应特定事件而执行的特定操作的技术称为事件处理。在编写执行事件处理的 ActionScript 代码时,您需要识别三个重要元素:

  • 事件源:发生该事件的是哪个对象?例如,单击了哪个按钮,或哪个 Loader 对象正在加载图像?事件源也称为事件目标。之所以有此名称,是因为它是计算机确定事件的目标位置的对象(也就是说,实际发生事件的位置)。

  • 事件:将要发生什么事情?您希望响应什么事情?识别特定事件非常重要,因为许多对象都会触发多个事件。

  • 响应:当事件发生时,您希望执行哪些步骤?

无论何时编写 ActionScript 代码来处理事件,都要求使用这三个元素。代码遵循以下基本结构(粗体元素是占位符,您要根据自己的具体情况填充):

function eventResponse(eventObject:EventType):void 
{ 
    // Actions performed in response to the event go here. 
} 
  
eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);

此代码用来完成两项任务。首先,定义一个函数,这是指定为响应事件而要执行的动作的方法。其次,调用源对象的 addEventListener() 方法。调用 addEventListener() 实质上是为指定事件“订阅”此函数。该事件发生时,将执行函数的动作。让我们更详细地讨论其中每个部分。

函数是提供了一种方法,可以将若干个操作用类似快捷名称的单个名称组合在一起,通过这个单个名称执行这些操作。除了不必与特定类关联之外,函数与方法完全相同。(事实上,术语“方法”可定义为与特定类相关联的函数。)在创建用于事件处理的函数时,请选择函数名称(本示例中名为 eventResponse)。还要指定一个参数(本示例中名为 eventObject)。指定函数参数类似于声明变量,所以还必须指明参数的数据类型。(在本示例中,该参数的数据类型为 EventType。)

您要侦听的每种事件类型都有一个与其相关联的 ActionScript 类。为函数参数指定的数据类型始终是与您要响应的特定事件关联的类。例如,click 事件(在用户使用鼠标单击某个项目时触发)与 MouseEvent 类相关联。若要为 click 事件编写侦听器函数,可使用数据类型为 MouseEvent 的参数定义侦听器函数。最后,在左大括号与右大括号之间 ({ ... }) 编写希望计算机在事件发生时执行的指令。

事件处理函数已编写。下一步要告知事件源对象(发生该事件的对象,如按钮)您希望其在该事件发生时调用此函数。通过调用该事件源对象的 addEventListener() 方法向该对象注册您的函数(所有包含事件的对象也都具有 addEventListener() 方法)。addEventListener() 方法有两个参数:

  • 第一个参数是您希望响应的特定事件的名称。每个事件都与一个特定类相关联。每个事件类都为其中每一个事件定义了一个特殊的值,就像唯一名称。对第一个参数使用该值。

  • 第二个参数是事件响应函数的名称。请注意,如果将函数名称作为参数进行传递,则在写入函数名称时不使用括号。

事件处理过程

下面分步描述了创建事件侦听器时执行的过程。在本例中,您将创建一个侦听器函数,在单击名为 myButton 的对象时调用该函数。

程序员实际编写的代码如下所示:

function eventResponse(event:MouseEvent):void 
{ 
    // Actions performed in response to the event go here. 
} 
 
myButton.addEventListener(MouseEvent.CLICK, eventResponse);

下面是此代码运行时的实际工作方式:

  1. 加载 SWF 文件时,计算机会注意到有一个名为 eventResponse() 的函数。

  2. 计算机随后运行该代码(具体地说,是指不在函数中的代码行)。在本例中,只有一行代码:针对事件源对象(名为 myButton)调用 addEventListener() 方法,并将 eventResponse 函数作为参数进行传递。

    在内部,myButton 保留正在监听其各个事件的函数的列表。调用 addEventListener() 方法时,myButtoneventResponse() 函数存储到其事件侦听器列表中。

  3. 在某一时刻,用户单击 myButton 对象以触发其 click 事件(在代码中将其标识为 MouseEvent.CLICK)。

    此时发生了以下事件:

    1. 创建对象,该对象是与发生的事件(此示例中为 MouseEvent)相关联的类的实例。对很多事件而言,此对象是 Event 类的实例。对鼠标事件而言,它是 MouseEvent 实例。对其它事件而言,它是与该事件关联的类的实例。创建的此对象称为事件对象,包含有关所发生的事件的特定信息:事件类型、发生位置以及其它特定于事件的信息(如果适用)。

    2. 计算机随后查看 myButton 存储的事件侦听器的列表。它逐个查看这些函数,调用每个函数并将事件对象作为参数传递给函数。由于 eventResponse() 函数是 myButton 的侦听器之一,因此,计算机将在此过程中调用 eventResponse() 函数。

    3. 当调用 eventResponse() 函数时,将运行该函数中的代码,因此,将执行您指定的动作。

事件处理示例

以下是事件处理代码的更多实际示例。给出这些示例,旨在提供关于编写事件处理代码时可以使用的一些常见事件元素及可用变体的建议:

  • 单击按钮开始播放当前的影片剪辑。在下面的示例中,playButton 是按钮的实例名称,而 this 是表示“当前对象”的特殊名称:

    this.stop(); 
     
    function playMovie(event:MouseEvent):void 
    { 
        this.play(); 
    } 
     
    playButton.addEventListener(MouseEvent.CLICK, playMovie);
  • 检测文本字段中的键入操作。在下面的示例中,entryText 是一个输入文本字段,而 outputText 是一个动态文本字段:

    function updateOutput(event:TextEvent):void 
    { 
        var pressedKey:String = event.text; 
        outputText.text = "You typed: " + pressedKey; 
    } 
     
    entryText.addEventListener(TextEvent.TEXT_INPUT, updateOutput);
  • 单击按钮导航到一个 URL。在本例中,linkButton 是该按钮的实例名称:

    function gotoAdobeSite(event:MouseEvent):void 
    { 
        var adobeURL:URLRequest = new URLRequest("http://www.adobe.com/"); 
        navigateToURL(adobeURL); 
    } 
     
    linkButton.addEventListener(MouseEvent.CLICK, gotoAdobeSite);

创建对象实例

在 ActionScript 中使用某个对象之前,首先该对象必须存在。创建对象的步骤之一是声明变量;然而,声明变量仅会在计算机内存中创建一个空位置。在尝试使用或操作变量之前,务必为变量指定实际值(即创建一个对象并将其存储在变量中)。创建对象的过程称为实例化对象。换句话说,是创建特定类的实例。

有一种创建对象实例的简单方法完全不涉及 ActionScript。在 Flash Professional 中,将一个影片剪辑元件、按钮元件或文本字段放置到舞台上并为其指定实例名称。Flash Professional 将自动使用该实例名称声明变量、创建对象实例并将该对象存储到变量中。同样,在 Flex 中,您通过对 MXML 标签进行编码或将组件放置到 Flash Builder Design 模式的编辑器中,在 MXML 中创建组件。为该组件分配 ID 后,该 ID 就成为包含该组件实例的 ActionScript 变量的名称。

不过,您并非总是希望以可视方式创建对象,而又不能创建非可视对象。可以通过其它若干种方法仅使用 ActionScript 创建对象实例。

借助几个 ActionScript 数据类型,可以使用文本表达式(直接写入 ActionScript 代码的值)创建实例。下面给出了一些示例:

  • 文本数字值(直接输入数字):

    var someNumber:Number = 17.239; 
    var someNegativeInteger:int = -53; 
    var someUint:uint = 22;
  • 文本字符串值(用双引号将文本引起来):

    var firstName:String = "George"; 
    var soliloquy:String = "To be or not to be, that is the question...";
  • 文本布尔值(使用字面值 truefalse):

    var niceWeather:Boolean = true; 
    var playingOutside:Boolean = false;
  • 文本数组值(在中括号中包含以逗号分隔的值列表):

    var seasons:Array = ["spring", "summer", "autumn", "winter"];
  • 文本 XML 值(直接输入 XML):

    var employee:XML = <employee> 
            <firstName>Harold</firstName> 
            <lastName>Webster</lastName> 
        </employee>;

ActionScript 还为 Array、RegExp、Object 和 Function 数据类型定义了文本表达式。

为任一数据类型创建实例的最常用方法是使用带有类名称的 new 运算符,如下所示:

var raceCar:MovieClip = new MovieClip(); 
var birthday:Date = new Date(2006, 7, 9);

使用 new 运算符创建对象通常称为“调用类的构造函数”。构造函数是在创建类的实例的过程中调用的一种特殊方法。请注意,在使用此方法创建实例时,在类名称后加上小括号。有时要在小括号中指定参数值。调用方法时还需要完成另外两项操作。

甚至对于可使用文本表达式创建实例的数据类型,也可以使用 new 运算符来创建对象实例。例如,下面的两行代码执行相同的操作:

var someNumber:Number = 6.33; 
var someNumber:Number = new Number(6.33);

熟悉使用 new ClassName() 创建对象的方法是非常重要的。许多 ActionScript 数据类型没有直观的表示形式。因此,无法通过将项目放置到 Flash Professional 舞台或 Flash Builder 的 MXML 编辑器的设计模式来创建。您只能使用 new 运算符在 ActionScript 中创建这些数据类型的实例。

Adobe Flash Professional

在 Flash Professional 中,new 运算符还可用于创建已在库中定义、但没有放到舞台上的影片剪辑元件的实例。