本文译者:egoldy
文章出处: http://www.ultrashock.com
文章性质:翻译
ActionScript 2.0-简介
随着FLASHMX2004的推出,Macromedia公司推出了一种新的脚本类型称为as2,在要教程中我们将要了解AS2的新特性。新的面向对象的模型以及如何使AS1的脚本过度到AS2。
为什么我们需要一种新的脚本语言。
如果你只是做一些简单的动画是不需要用一种新的脚本语言的,其实有许多项目是不需要脚本语言的。如果你真的不需要使用脚本语言那这个教程将是一个很短的教程,现在你就可以结束了。:)
如果你是一名开发人员,在开发一些比较复杂的项目,那么AS1就显得有些力不从心,或者不能胜任。对于使用主流语言如java,c++,c#开发程序的程序员来说AS1是很怪的。他们是要走一些弯路来学习AS1特别是在面向对象编程时。
在as2中这些程序员将发现许多熟知的语法,AS2象JAVA。JSCRIPT.NET和javascript 2.0的程序员将感觉更好,因为AS2的语言基础来自于ECMASCRIPT EDITION 4.AS2可以使程序员写出更健状的程序,也可以吸引更多的程序员来学习FLASH。
好,你可能并不开发程序,那你喜欢开发游戏吗。或者是开发交互式的展示。好消息是AS2为我们开发这些提供了很有力的支持。
如果你对学习AS2没有兴趣,也不用担心。因为macromedia保留了AS1语法。你只是不能掌握这种语言的新特性而已。实际上在最后的编译过程中AS2和AS1都将被编译为相同的bytescode。这么做的原因大多是为了兼容FLASH6。ok.下面我们将继续学习。
ActionScript 2.0-AS1.0中的一点点面向对象编程
在我们转移到AS2之前先让我了解一下在AS1时的面向对象的编程。这一节对于在FLASH5和FLASHMX不太了解面向对编程的人来说很重要。如果你已经很了解这些可以直接跳过此节。
尽管AS1不是真正的面向对象的编程语言,开发人员已经在有些时候使用它进行面向对象的编程了。AS1中的任何东西都是依靠原型链也就是对象之间的联系。所以在AS1中使用面向对象需要了解原型链(或者是原型的关键字)。
AS1的类就象是规则的函数。方法附加在这个的类的原型上。例如:
// Wizard class
function Wizard() {
}
// help()方法附加在WIZARD函数的原型上。
Wizard.prototype.help = function() {
};
如果我们把help()直接放在wizard class类中。FLASH在查找属性和方法时就不会找到它,因为FLASH在查找是沿着原型链进行搜索的。而在为所有的Wizard类创建一个实例copy.下面就是为每个实例创建的copy. function Wizard(){ this.help=function(){}}对于java,c#的程序员来说。这样的将方法代码放在类中会看来很熟悉,然而为了代码的可重用性我们还是应将方法附加在类的原型链上。 在下面的例子中假如我们针对一个类上有两个方法,一个是附加在原型链上,另一个是直接放在类中,flash将先获得内部方法。
// AS1_OOP_01.fla
function TestClass() {
this.method = function() {
trace("Internal method");
}; this.prop = ">>> Internal prop";
}// Attach a method to the prototype object of the class
TestClass.prototype.method = function() {
trace("Prototype method");
};TestClass.prototype.prop = ">>> Prototype prop";// Create an instance of the TestClass class
var w = new TestClass();// Internal method is located before the prototype method
w.method();// Replace the Internal method
w.method = function() {
trace("New method");
};
w.method();// Delete the Internal method
delete w.method;// The only method remaining is the prototype method
w.method();// Test the properties
trace(w.prop);w.prop = ">>> New prop";
trace(w.prop);delete w.prop;
trace(w.prop);
上面的例子的输出内容为:
screen.width-300)this.width=screen.width-300" border=0从上面这个例子我们可以看出在使用AS1面向对向对于初学者来说是极易混淆的。其中知道将代码写在什么位是很重要的,因为它可能经常出现意想不到的结果,正如在商业上有一句流行的话是:但是等等,还有更多。。。。
ActionScript 2.0-AS2.0中的新特性
AS2中的新特性
AS2实际上不是一种新的语言,它是在AS1基础上的升级,如果你基本上掌握了AS1编程,那么学习它应是很容易的。接下来让我们看一下AS2所提供的新东西。
.严格的数据类型和编译提示。
.以数据类型为基础的代码提示。
.针对OOP的新的关键字和特性。
class、Interface、extends、implements、public、private、static、dynamic、intrinsic、import、class path、get、set
下面就让我看一下以上这些每一项都有什么新特点。
严格的数据类型
在比较专业编程语言中,表达是依靠数据类型的。它给我们的具大的好处是:它可以帮助编译器发现潜在的问题,获取类型不配的错误信息。它可以使你的代码清晰易读。
在AS1中声明一个变量如count的过程如下:
var count;
在AS2中声明的过程应是这样。
var count:Number;
注意,它的语法结构是:<变量>:<数据类型>,这对许多java,c#,c++的程序员来说可能认为有些怪,这实际上是ECMA-262协会制定的规定,macromedia公司是按照这个规定做的而已。
AS2的变量,函数以及返回值都支持严格的数据类型,如下例函数接收字符串参数返回一个布尔值。
function func(arg:String):Boolean{};
当一个函数在没有接收到参数和返回任何值时,使有Void做为数据类型。
function func(arg:Void):Void{};
这种参数被写空的形式看起来有些怪,但这种用法却被大量的应用在组件的编写上,它只意味着当前没有指定的参数。然而如果你试着将参数传给这个函数,编译器在编译时是不会出现任何的错误提示同时也会将参数进行传递的。
尽管AS2支持严格的数据类型,却并没有被真正的执行这种语法,可是当编译器发现有数据类型不配的情况时就会出现错误提示信息,使用严格的数据来进行编程是一个好的开始习惯。它的好处我们在上面已经说过。如果你使用严格的数据类型来编程,那么你在发布时应指定使用AS2,并且指定发布为FLASH PLAYER 7。
使用严格的数据类型,新的编译器为你提供的了许多新的编译提示阻止你的影片出现类型不配的错误,但在编译过程中可能要花去较长的时间调试。
代码提示
在FALSHMX中的代码提示是依据变量名称的扩展如myPushButton_pb,mycomboBox_cb中的_pb,_cb来出现代码提示的,在2004中你会发现大多数的变量扩展不在生效,新版本的AS2以不同的约定型式来出现代码提示。
当一个变量类型被指定(如果这个变量类型对这个类是有效的)方法和属性的代码提示会在点的后面出现,否则是不会出现任何代码提示的。通过指定的数据类型来显示comboBox的代码提示如:
var combo:mx.controls.comboBox;
combo.
screen.width-300)this.width=screen.width-300" border=0你可以通过打开如下文件查看默认的扩展代码提示如:
<Flash installation folder>\<language>\First Run\ActionsPanel\AsCodeHints.xml
小提示:在2004中加入FLASHMX的代码提示
如果你使用2004来编辑你的FLASHMX文档,你可以将部分的FLASHMX代码提示加入到2004的代码提示中。
复制<Flash MX installation folder>\<language>\First Run\ActionsPanel\CustomActions\UIComponents.xml,中的
<codehints>
<typeinfo pattern="*_ch" object="FCheckBox"/>
<typeinfo pattern="*_pb" object="FPushButton"/>
<typeinfo pattern="*_rb" object="FRadioButton"/>
<typeinfo pattern="*_lb" object="FListBox"/>
<typeinfo pattern="*_sb" object="FScrollBar"/>
<typeinfo pattern="*_cb" object="FComboBox"/>
<typeinfo pattern="*_sp" object="FScrollPane"/>
<typeinfo pattern="globalStyleFormat" object="FStyleFormat"/>
</codehints>
这一段到Flash MX 2004's UIComponents.xml文件的结束标记之前,同样将这一段复制到2004的AsCodeHints.xml文件的<codehints></codehints> 之间注意多余的<codehints>标记要删除。
现在你就可以在2004中使用FLASHMX的组件代码提示了。
ActionScript 2.0-针对OOP的关键字和特性
下面我们将真正研究一下AS2的特性,在早期往往是在讨论AS1复杂的面向对象编程比实际工作更多一些,现在你将很快的看到,你不用花很多时间去争论怎么样做到最好的继承,将代码放置在哪和如何组织好你的代码库。
让我们先回顾一下OOP基础,OOP的最基本单元是对象,它包含两部分:代码和数据。由于对象是一种以自己自足的形式出现,因此它的数据和代码(方法)不需要公开。就象一个黑盒子,对象负责以自身的方法去管理自身的数据,对象与对象之间通过传递信息通讯。这些信息以公用或公开的方式传递和接收。而内部的数据和方法并没有直接参与其中,这就是OOP的基本原理。
在OOP的设计中,比做是一张大图,要想到重点和要实现的目标,以及各个部分之间的联系。将这张大图分成小的单元,并且保证各自的自身独立性,那么整个项目就很容易完成。而这些小的单元在OOP中就被称为类。所有这些AS2都提供了很好的支持。
下面这些关键字与OOP有关:
class interface extends implements
public private static dynamic
import get set intrinsic
我们不在重复mcromedia的帮助文档中对每一关键字的描述,我们可以用实例来说明。注意关键字intrinsic是mcromedia内部使用的关键字。这里面没package也就包的关键字,但是它与类路径的工作方式是很重要的,就象是其它语言中的包一样,如JAVA。
下面我们来看一下例子,在AS1中的类,将其改写为AS2的类。
// 构造函数
_global.Parent = function(name) {
this.init.apply(this, arguments);
};
// 类的属性
Parent.lastNames = new Array();
Parent.prototype.init = function(name) {
this.lName = name;
Parent.lastNames.push(name);
this.id = Parent.lastNames.length-1;
trace("Added ’"+ Parent.lastNames[this.id] +"’ at: "+ this.id);
};
Parent.prototype.getLastName = function() {
return (this.lName);
};
Parent.prototype.setLastName = function(s) {
this.lName = s;
Parent.lastNames[this.id] = s;
};
Parent.prototype.getNames = function() {
return (Parent.lastNames);
};
Parent.prototype.addProperty("lastName", Parent.prototype.getLastName, Parent.prototype.setLastName);
Parent.prototype.addProperty("names", Parent.prototype.getNames, null);
上面的代码改写为AS2就向下面这样:
新的关键字被应用在如下的例子中:class, private, public, static, get, set
class Parent {
private var lName:String = "";
private var id:Number;
private static var lastNames:Array = new Array();
// 构造函数
public function Parent(name:String) {
init.apply(this, arguments);
}
private function init(name:String):Void {
lName = name;
lastNames.push(name);
id = lastNames.length-1;
trace("Added ’"+ lastNames[id] +"’ at: " + id);
}
public function get lastName():String {
return lName;
}
public function set lastName(s:String):Void {
lName = s;
lastNames[id] = s;
}
public function get names():Array {
return lastNames;
}
}
通过上面的AS1和AS2执行同一个类。我