代码改变世界

AS3(2) --- 处理对象

2007-02-15 15:18  @影子@  阅读(88)  评论(0编辑  收藏  举报

ActionScript 是一种面向对象的编程语言。面向对象的编程仅仅是一种编程方法,与使用对象来组织程序中的代码的方法实际上没有什么差别。
  
  先前我们将计算机程序定义为计算机执行的一系列步骤或指令。那么从概念上讲,我们可能认为计算机程序只是一个很长的指令列表。然而,在面向对象的编程中,程序指令划分为不同的对象 — 代码分组为功能块,因此相关类型的功能或相关的信息会组合到一个容器中。
  
  事实上,如果您已经在 Flash 中处理过元件,那么您应已习惯于使用对象了。假定您定义了一个影片剪辑元件 — 比如说,绘制一个矩形 — 并且您将该元件的副本放在了舞台上。从严格意义上来说,该影片剪辑元件也是 ActionScript 中的一个对象;即 MovieClip 类的一个实例。
  
  您可以修改该影片剪辑的不同特征。例如,当选中该影片剪辑时,您可以在属性检查器中更改许多值,如该影片剪辑的 x 坐标、剪辑的宽度,也可以实施各种颜色调整(如更改剪辑的 alpha 值,即透明度),或对之应用投影滤镜。还可以使用其它 Flash 工具进行更多更改,例如,使用“任意变形”工具旋转该矩形。在 Flash 创作环境中修改一个影片剪辑元件时所做的更改,同样可在 ActionScript 中通过更改组合在一起、构成称为 MovieClip 对象的单个包的各数据片断来实现。
  
  在 ActionScript 面向对象的编程中,任何类都可以包含三种类型的特性:
  
  属性
  
  方法
  
  事件
  
  这些元素共同用于管理程序使用的数据块,并用于确定执行哪些动作以及动作的执行顺序。
  
  
  
  属性
  属性表示某个对象中绑定在一起的若干数据块中的一个。Song 对象可能具有名为 artist 和 title 的属性;MovieClip 类具有 rotation、x、width 和 alpha 等属性。您可以像使用单个变量那样使用属性;事实上,可以将属性简单地视为包含在对象中的“子”变量。
  
  以下是一些使用属性的 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;
  请注意上面几个示例的通用结构:将变量(square 和 triangle)用作对象的名称,后跟一个句点 (.) 和属性名(x、rotation 和 scaleX)。句点称为点运算符,用于指示您要访问对象的某个子元素。整个结构“变量名-点-属性名”的使用类似于单个变量,作为计算机内存中的单个值的名称。
  
  
  
  方法
  方法是指可以由对象执行的操作。例如,如果在 Flash 中使用时间轴上的几个关键帧和动画制作了一个影片剪辑元件,则可以播放或停止该影片剪辑,或者指示它将播放头移到特定的帧。
  
  下面的代码指示名为 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,所以只能包含文本值。下面的一行代码将变量 numericData 中的数值转换为文本,然后使这些文本显示在屏幕上名为 calculatorDisplay 的 TextField 对象中:
  
  calculatorDisplay.text = numericData.toString();
  事件
  我们已经介绍了计算机程序就是计算机分步执行的一系列指令。一些简单的计算机程序仅包括计算机执行的几个步骤以及程序的结束点。然而,ActionScript 程序可以保持运行、等待用户输入或等待其它事件发生。事件是确定计算机执行哪些指令以及何时执行的机制。
  
  本质上,事件就是所发生的、ActionScript 能够识别并可响应的事情。许多事件与用户交互有关 — 如用户单击按钮或按键盘上的键,但也有其它类型的事件。例如,如果使用 ActionScript 加载外部图像,有一个事件可让您知道图像何时加载完毕。本质上,当 ActionScript 程序正在运行时,Adobe Flash Player 和 Adobe AIR 只是坐等某些事情的发生,当这些事情发生时,它们将运行您为这些事件指定的特定 ActionScript 代码。
  
  
  
  创建对象实例
  当然,在 ActionScript 中使用对象之前,该对象首先必须存在。创建对象的步骤之一是声明变量;然而,声明变量仅仅是在计算机的内存中创建一个空位置。在尝试使用或操作变量之前,您必须为变量指定实际值(即创建一个对象并将之存储在变量中)。创建对象的过程称为实例化 对象,也就是创建特定类的实例。
  
  有一种创建对象实例的简单方法完全不涉及 ActionScript。在 Flash 中,当将一个影片剪辑元件、按钮元件或文本字段放置在舞台上,并在“属性”检查器中为它指定实例名时,Flash 会自动声明一个拥有该实例名的变量、创建一个对象实例并将该对象存储在该变量中。同样,在 Adobe Flex Builder 中,当您在 MXML 中创建一个组件(通过用 MXML 标签进行编码或通过将组件放置在处于设计模式下的编辑器中)并为该组件分配一个 ID(在 MXML 标记中或在 Flex 属性视图中)时,该 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...";
  文本布尔值(使用字面值 true 或 false):
  
  var niceWeather:Boolean = true; var playingOutside:Boolean = false;
  文本数组值(在方括号中包含以逗号分隔的值列表):
  
  var seasons:Array = ["spring", "summer", "autumn", "winter"];
  文本 XML 值(直接输入 XML):
  
  var employee:XML = Harold Webster ;
  ActionScript 还为 Array、RegExp、Object 和 Function 数据类型定义了文本表达式。有关这些类的详细信息,请参阅处理数组、使用正则表达式和Object 数据类型。
  
  对于其它任何数据类型而言,要创建一个对象实例,应将 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() 创建对象的方法是非常重要的。如果需要创建无可视化表示形式(因而无法通过将项目放置在 Flash 舞台上来创建,也无法在 Flex Builder 的 MXML 编辑器的设计模式下创建)的 ActionScript 数据类型的一个实例,则只能通过使用 new 运算符在 ActionScript 中直接创建对象来实现此目的。
  
  具体到 Flash 中,new 运算符还可用于创建已在库中定义、但没有放在舞台上的影片剪辑元件的实例。