Flash教学 → Action应用 AS2.0面向对象编程基础(一)

在flashmx2004专业版中编程
    打开你的flash,用Ctrl+N就可以打开New document对话框。flash2004现在不仅可以编辑Flash文件(*.fla),而且还能编辑ActionScript文件(*.as),Flash javascript文件(*.jsfl),Flash工程文件(*.flp)文件。
screen.width-430)this.width=screen.width-430 align=center border=0> 
让我们来建立第一个flash 应用程序了,给大家对在flash mx 2004专业版有一个大概的了解.
1.建立一个ActionScript文件(ActionScript File),名为FirstClass.,然后你就可以看到.as的编辑框了,键入如下代码:

class FirstClass                                        //(1)
{
        private var myData:Number=10;                   //(2)    
        public  function traceMyData():Void             //(3)
        {
                trace(myData=+myData);
        }
}

然后选择好路径,我这里是存在G:/tutorial下面,存成FirstClass.as.
这是我们在flash mx 2004中定义的第一个类.为了给大家一个感性的认识, 简单地介绍一下这个类的结构. 第(1)行是类头, 由class关键字定义一个类, 注意存成.as文件的时候,文件名应与类名一样.类头下面的全是类体了.第(2)行是类的数据成员myData的定义,接触过AS1.0的读者请注意:其中private是访问限定字,Number表示数据类型为数字.这与AS1.0有不同之处.第(3)行定义了一个成员函数,traceMyData用来打印myData的值,接触过AS1.0的读者请注意:其中public是访问限定字,Void为返回数据类型,这里的Void表示没有返回值.
2.用Ctrl+N建立一个flash文档(Flash document),取名为myFirst2004Program.
3.用F9打开ActionScript编辑面板, 在专业版里面, 没有普通编辑模式,只存在专家模式了.
4.点击Action面板右上角的按钮screen.width-430)this.width=screen.width-430 align=center border=0>,选择Preferences定义Action面板的参数和选项(Ctrl+U).如图所示即为Preferences面板.

screen.width-430)this.width=screen.width-430 align=center border=0>

其中有一个重要的设置就是AS类的路径设置.
5.选择Preferences面板中的ActionScript标签,然后再点选Language里面的ActionScript 2.0 Settings..,就会弹出ActionScript Setting对话框.如下图所示:
screen.width-430)this.width=screen.width-430 align=center border=0>

默认的有一个$(LocalData)/Classes表示你的flashMX2004安装路径下面的内建类的路径.还有一个.号,表示当前工作路径.假如读者是一个java爱好者,配置过java的SDK,那对这个应该不会陌生了,这与java的classpath设定完全是一个道理.
6.选择classpath下面的screen.width-430)this.width=screen.width-430 align=center border=0>号, 你就可以增加一个类路径了.选择刚才存放的G:/tutorial,你就成功地添加了一个类路径,不管你的fla文件存在哪儿, 它都能导入到你刚才定义的FirstClass类. 当然,假如你把myFirst2004Program.fla也存在G:/tutorial下面,那就大可不必定义类路径. 因为通过当前工作路径.就可以导入FirstClass类了.
7.在myFirst2004Program.fla文件的第一帧,编写如下代码:

var myInstance:FirstClass=new FirstClass();        //(1)
myInstance.traceMyData();                           //(2)

其中第(1)行, 新建FirstClass类的一个对象,名为myFirstClass.第二行调用myFirstClass的traceMyData成员函数.
8.用Ctrl+Enter,测试一下.output窗口就会出现myData=10.是不是很新奇呢?

///
///
                           AS2.0面向对象编程基础(二)
对象和类(Object & Class)
什么是对象呢? 世界上所有的特定的物体都是对象,包括可见的和不可见的,形象的和抽象的.你楼下的停的那辆自行车是一个对象, 大街上的一个漂亮mm是一个对象, 天上的一朵云是一个对象,我做的一道数学题也是一个对象.每个对象都有自己的属性和方法.自行车有型号,高度等属性, 也有骑动的方法;mm有姓名, 身高, 体重的属性,有走路,挥手, 跳舞,抛媚眼等方法....
那什么是类呢?先来想想这个,街上的人多的是,有一些mm,有一些王子,还有一群恐龙和一堆青蛙.每一个mm、王子、恐龙、青蛙都是一个对象,他们有什么共性呢? 他们都是人!(有人要提出非议:恐龙和青蛙不是人.AOL:faint.....)。他们属于人类,不管他们长得好看还是难看, 他们都有鼻子有眼,会说话, 最重要的是会制造生产工具(上哲学课?)。类是所有有相同共性的对象的总称,当然对象的数量可以为无限。 人类是所有会制造劳动工具的生物的总称,所以人是一个类, 而每一个具体的人是一个对象。还有一种说法更形象点儿, 类是建立对象的模型,对象是类的实例。 想像一下现在你要用你的双手来做一个人的泥像。最好的方法就是用一个模具, 用一次就可以造出一个人泥像来。每一个泥像等同于一个对象, 而这个模具等同于一个类了.
     下面我们来设计一个Person类.

class Person
{
        //constructor
        public function Person(n:String,a:Number,tel:Number)
        {
                name=n;
                age=a;
                telNum=tel;
        }
       
        //methods
        public function getName():String
        {
                return name;
        }
       
        public function getAge():Number
        {
                return age;
        }
       
        public function getTelNum():Number
        {
                return telNum;
        }
       
        public function saySomeThing():Void
        {
                trace(I am a Person named +name);
                trace(I am +age+ years old);
                trace(My telephone number is +telNum);
                trace(==================================);
        }
       
        //properties
        private var name:String;
        private var age,telNum:Number;
}
在AS2.0声明类的一般形式为:

class ClassName
        {
          // 类体
        }

在类体定义数据成员(由于其经常表示类的属性, 所以一般称为属性)和成员函数(由于其经常表示类的方法,所以一般称为方法).一般情况下,属性是声明为私有类型,用关键字private来定义。这样的话,只有类的成员才能访问到该属性。有其它面向对象语言如c++,c#,java等开发经验的读者请注意,这里的privte其实相当于这些语言的protected,另外这个private也通过ASSetPropFlag函数来模拟的,有一些bug.这些将在以后的篇章中再详谈.而类的方法,则一般声明为公有类型,用关键字public来定义。该类的所有对象都能使用该方法。

这个Person类有如下属性,分别表示一个人的姓名,年龄,还有联系电话.
       
        private var name:String;
        private var age,telNum:Number;
这个类的方法为:

public function getName():String
        public function getAge():Number
        public function getTelNum():Number
        public function saySomeThing():Void

创建对象
把上面的类存成Person.as之后,新建一个aolWaterflier.fla文件就可以创建该类的对象了。 创建对象要用到关键字new
方法如下:

var waterflier:Person=new Person(waterfiler,19,13576092805);
var aol:Person=new Person(AOL,22,13987654321);

其中waterflier和aol是两个变量, 它的类型是Person.
Person类在用new关键字创建一个对象的时候,你可以把这个对象看做是一把勺子,一个变量可以看做是一只手,而你要使得你的变量按照用户希望的方式来随时控制或访问这个对象.你可以握住这个勺子的柄来实现.对象也有一个这样的柄,而且每次建立一个对象的时候会产生不同的柄,这个柄就叫做句柄,它是对象的一个引用.而你把这个引用赋值给变量waterflier,aol.那么这两个变量,就拥有了对两个不同的Person类的对象的引用.那么你就可以使用该对象的属性和方法了.

aol.saySomeThing();
trace(waterflier.getName()+ +waterflier.getAge()+ +waterflier.getTelNum());

构造函数
注意到类体有一开始有一个名为Person的函数。它就是该类的构造函数,它是一个特殊的成员函数。构造函数的作用是在创建该类的对象初始化对象中的字段。构造aol对象的时候,把AOL赋给n,22赋给a,13987654321赋给tel.然后通过n,a,tel初始化name,age,telNum.
注意:在声明构造函数时, 不能有返回值.在AS2.0中,不像其它的面向对象的语言中,构造函数可以重载。假如你定义了两个或者两个以上名为Person的构造函数时,编译就会提示出错。

Note:
1.创建对象的时候,一定要指明对象的数据类型,这里为Person类. 假如你没有定义数据类型的话,private所声明的属性就可以访问. 如:

var waterflier=new Person(waterfiler,19,13576092805);
trace(waterflier.name+ +waterflier.age+ +waterflier.telNum);

这样封装就失去了实际意义了.

2.命名的一些约定:
(1)类名一般为名词(Person)或者形容词加名词(FirstClass),表达要精准.每个词的首个字母要大写.
(2)变量名一般也为名词(name,age)或者形容词加名词,一般第一个词的首个字母小写,接着的首个字母要大写(telNum).
(3)函数名一般为动宾结构,一般第一个词的首个字母小写,接着的首个字母要大写(getName,getAge,getTelNum,saySomeThing).

///
///
    AS2.0面向对象编程基础(三)

静态属性和静态方法(Static Property & Static Method)
上一节讲了,创建一个对象就会使该对象初始化一些具体的属性值。Person类举了两个实例, 一个是waterflier,还有一个aol.在创建waterflier对象和aol对象的时候,分别初始化了他们的属性。那么有时候,我的Person类的各个对象有一个所有对象都能访问的属性, 比如说某公司招人,这个公司已经招人的总数totalPersonnels则为这样的一个例子。 当然你可以这样实现:

class Person
{
    //other properties and methods omitted...
public function getTotalPersonnels():Number
{
        return totalPersonnels;
}

public function incrementEmploy()
{
        totalPersonnels++;
}

private var totalPersonnels:Number=0;
}

但是公司每招一个人都得调用所有的Person类的对象中的incrementEmploy()方法, 这样假如对象建了很多, 就会很麻烦。

在AS2.0中引进了静态属性.则可以这样实现:

class Person
{
    //other properties and methods omitted...
public function getTotalPersonnels():Number
{
        return totalPersonnels;
}

public function incrementEmploy()
{
        totalPersonnels++;
}

private static var totalPersonnels:Number=0;
}

静态属性的值由所有实例共享,它是属于类的性性,而不是某个具体的实例的属性.静态属性只能由类来访问.你可以把private改成public试试。在一个fla文件用使用
trace(Person.totalPersonnels);
没有任何错误,但是你建立了一个rei实例的话,用rei的属性来访问就会出错。
var rei:Person=new Person();
trace(rei.totalPersonnels);
这时编译器就会报错:Static members can only be accessed directly through classes.
但是你可以通过getTotalPersonnels方法来访问静态属性。

trace(rei.getTotalPersonnels()):

下面来看看静态方法,静态方法和静态属性一样是属于类的,而不是属于某个具体对象的。

class Person
{
    //other properties and methods omitted...
public static function getTotalPersonnels():Number
{
        return totalPersonnels;
}

public static  function incrementEmploy()
{
        totalPersonnels++;
}

private static var totalPersonnels:Number=0;
}

这时你就可以用Person类访问这些方法了,而用其实例rei的方法一样会报刚才的错.
trace(Person.getTotalPersonnels());//this is the right access .

有一点要注意,静态方法只能访问静态属性。你把totalPeronnels属性的static去掉,然后再用Person.getTotalPersonels()方法访问,就会报错:
Instance variables can not be accessed in static functions.
这是为什么呢?前面已经说得很清楚了, static所定义的属性是属于类的,而未加static的一般属性是属于具体的实例的.不能用类的方法去访问具体的一个对象的属性.

///
///
    AS2.0面向对象编程基础(四)

获取和设置方法(get/set method)
一般的情况下,对象的属性都是设为私有的,它除了对象自身的方法从外部无法访问。那么我们编写代码的时候怎么才能访问到这些属性呢?当然只有通过公有方法来实现了。好的面向对象编辑习惯要求程序员给对象客户提供有效的对私有属性进行操作的公有获取方法和设置方法。这两个方法分别称为get方法和set方法。
下面我们以Person类来说明获取和设置方法。

class Person
{
        //get method
        public function getName():String
        {
                return n;
        }
       
        //set method
        public function setName(newName:String):Void
        {
                 n=newName;     
        }

//private property
        private var n:String;

//others omitted...
}
 
这时你可以新建类的对象,使用它的getName()和setName()方法来获取和设置其私有属性。

var peng:Person=new Person();
peng.setName(peng);
trace(peng.getName());

以上是传统的get/set方法,然而传统的方法不是很简洁,获取和设置用了两个函数。其实在AS2.0中有get和set关键字可以实现,获取和设置共用同一个函数名。 把上面的代码写成这样:

class Person
{
        //get method
        public function get name():String
        {
                return n;
        }
       
        //set method
        public function set name(newName:String):Void
        {
                 n=newName;     
        }

//private property
        private var n:String;

//others omitted...
}

这样你就可以使用下面的简单方法来实现获取和设置对象的属性了。 

var peng:Person=new Person();
peng.name=peng;
trace(peng.name);

而很多时候名字一旦定下来了,是不能改变的,这就是只读属性,不能写。我们可以只使用get方法,而不用set方法来实现。让我们用一个构造函数来重新定义这个Person类吧。

class Person
{
        //consturctor
        public function Person(newName:String)
        {
                n=newName;
        }

//get method
        public function get name():String
        {
                return n;
        }

//private property
        private var n:String;

//others omitted...
}

使用方法:

var peng:Person=new Person(peng);
trace(peng.name);

类似的只写属性,那就可以只使用set,而不用get来实现.大家可以自己试试。 
///
///
    AS2.0面向对象编程基础(五)
动态类(dynamic class)
一般的我们定义的类, 不能在外部定义基于这个类的对象的方法和属性了. 在AS2.0面向对象编程基础(二)里面我们介绍了一个Person类. 我想为这个类加一个属性:性别(sex).
在一个fla文件里, 你试试这样编写:

var lei:Person=new Person();
lei.sex=male;

测试一下就会报错: There is no property with the name 'sex'.
现在我们可以用dynamic关键字,加在class的前面重新定义那个Person类.

dynamic class Person
{
        //constuctor
        public function Person(n:String,a:Number,tel:Number)
        {
                name=n;
                age=a;
                telNum=tel;
        }
       
        //properties
        private var name:String=;
        private var age,telNum:Number;
       
        //others methods and properties defined external
}

在这个类里面我们只定义了一个构造函数,三个属性:姓名、年龄和电话。新建一个fla文件。我们可以在外部定义获取这些属性的函数,并且有一个介绍自己的函数。而且可以定义他的性别这个属性。下面是代码:

Person.prototype.getName=function():String
{
        return this.name;
}

Person.prototype.getAge=function():Number
{
        return this.age;
}

Person.prototype.getTelNum=function():Number
{
        return this.telNum;
}

Person.prototype.saySomeThing=function():Void
{
        trace(I am a Person named +this.getName());
        trace(I am +this.getAge()+ years old);
        trace(My telephone number is +this.getTelNum());
        trace(==================================);
}
var lei:Person=new Person(lei,20,1381234567);
lei.saySomeThing();
lei.sex=male;
trace(And I am a  +lei.sex);

注意上面有一个this关键字, 它表示对对象自身的引用,lei对象的this就是指自身, 自身的姓名属性就可以用this.name表示。
在output窗口不但不会报错, 而且还会输出:

I am a Person named lei
I am 20 years old
My telephone number is 1381234567
==================================
And I am a  male

实际上我们最熟悉不过的MovieClip类就是一个动态类, 我们可以随时给MovieClip类定义的对象添加属性,给MovieClip添加方法供具体的对象使用。你可以定义一个MoiveClip.prototype.drawTriangle()方法,那么每个MovieClip对象都可以使用这个方法来画三角形了。

MovieClip.prototype.drawTriangle=function():Void
{
        beginFill (0x0000FF, 50);
    lineStyle (5, 0xFF00FF, 100);
    moveTo (200, 200);
    lineTo (300, 300);
    lineTo (100, 300);
    lineTo (200, 200);
    endFill();
}
_root.createEmptyMovieClip(myMovieClip,1);
myMovieClip.drawTriangle();

这时你可就可以看到一个三角形了.:)

screen.width-430)this.width=screen.width-430 align=center border=0>  
///
///
    AS2.0面向对象编程基础(六)

继承(一)(inherit)
在说这个之前, 我要郑重地向大家说:It is important!没有继承的语言根本不能称之为一种面向对象的语言, 继承是面象对象最重要的特性。我们把Person类简写成只有一个方法和一个属性的类如下:
/   Person.as   ///
class Person
{
        //constructor
        public function Person(n:String)
        {
                newName=n;
        }
       
        //method
        public function get name()
        {
                return newName;
        }
       
        //property
        private var newName:String;
}
 
我们已经定义了一个类型,这时我们有需要定义另一些比较特殊的类型。比如说程序员就是一种特殊的能写程序的人类,而美工就是一种特殊的能做设计的人类。(不好意思,我常年蹲工作室,接触最多的人就是这两种)。程序员有善长的编程语言的特殊属性,写代码的特殊方法;美工有善长的设计软件的特殊属性,设计的特殊方法,这些都是Person类所没有的。我们可以重新定义这两个类,像下下面这样:
//   CodeMan.as   ///
class CodeMan
{
        //constructor
        public function CodeMan(n:String,l:String)
        {
                newName=n;
                skilledLanuage=l;
        }
       
        //methods
        public function get name()
    {
            return newName;
    }

public function writeCode():Void
        {
                trace(I am using  +skilledLanuage+ lanuage to write codes);
        }
       
        //properties
        private var newName:String;
        private var skilledLanuage:String;
}

/   Designer.as  
class Designer
{
        //rewrite constructor
        public function Designer(n:String,s:String)
        {
                newName=n;
                skilledSoftWare=s;
        }
       
        //methods
        public function get name()
    {
           return newName;
    }

public function Design():Void
        {
                trace(I am using  +skilledSoftWare+ to design a web.);
        }

FLASH2.0学习教程相关推荐

  1. Blender 3.0基础入门学习教程 Introduction to Blender 3.0

    成为Blender通才,通过这个基于项目的循序渐进课程学习所有主题的基础知识. 你会学到什么 教程获取:Blender 3.0基础入门学习教程 Introduction to Blender 3.0- ...

  2. Blender3.0动画制作入门学习教程 Learn Animation with Blender (2021)

    要求 下载并安装Blender.免费下载和免费用于任何目的. 描述 加入我的动画课程. 在本课程中,我将从头开始讲述在Blender中创建动画场景的过程. 从第一步到最终渲染.在这个课程中,我们将使用 ...

  3. Python学习教程:0基础学Python?手把手教你从变量和赋值语句学

    这篇Python学习教程将手把手教你入门学Python,从变量和赋值语句学起,前面也有专门给大家出过相关的详细教程,有需要的伙伴,可以找一下前面的教程! 导读:在本文中,你会学到如何处理数字.定义与使 ...

  4. java学习_Python基础学习教程:从0学爬虫?让爬虫满足你的好奇心

    Python基础学习教程:从0学爬虫?让爬虫满足你的好奇心 有必要学爬虫吗? 我想,这已经是一个不需要讨论的问题了. 爬虫,"有用"也"有趣"! 这个数据为王的 ...

  5. 【Vue学习笔记】尚硅谷Vue2.0+Vue3.0全套教程丨vue.js从入门到精通

    尚硅谷Vue2.0+Vue3.0全套教程丨vue.js从入门到精通 1.Vue核心部分 1.1 Vue简介 1.1.1 Vue是什么? Vue是一套用于构建用户界面的渐进式JavaScript框架. ...

  6. [Vue]学习笔记目录 【Vue2与Vue3完结】 (尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通)

    文章目录 前言 遇见的问题及其解决方案 之前笔记 Vue2 Vue3 前言 本笔记根据如下笔记和视频进行整理 老师的课件笔记,不含视频 https://www.aliyundrive.com/s/B8 ...

  7. AnyCasting v6.0 Win32_64 带安装视频送学习教程韩国铸造模拟软件

    AnyCasting v6.0 Win32_64 带安装视频送学习教程韩国铸造模拟软件 铸造模拟软件 AnyCasting 4.0 中英文版 带安装视频 送学习教程 AnyCasting V2.4中文 ...

  8. ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet:学习教程目录

    [源码.文档.软件.硬件.技术交流.技术支持,入口见文末] [所有相关IDE.SDK和例程源码均可从群文件免费获取,免安装,解压即用] 持续更新中,欢迎关注! 一.理论 ZigBee 3.0理论教程- ...

  9. air调用java,AIR2.0入门教程:与Java应用交互

    在之前的一篇文章中,我介绍了如何使用AIR2.0新增的NativeProcess类与本地进程进行交互和通讯,在那个例子里面我们使用了C++ 的代码,实际上只要是基于命令行的标准输入输出,AIR2.0的 ...

最新文章

  1. redis的过期策略
  2. (LINQ 学习系列)(8)Linq教程实例: 事务处理
  3. 新IT运维模式下,全栈溯源助你解应用性能监控难题
  4. linux环境下主从复制,Linux之CentOS上配置MariaDB主从复制
  5. 01、3dB双分支定向耦合器
  6. 腾讯bugly接入详解
  7. 投资怕选错房?跟着买房路线图走不亏!
  8. 记忆圆周率前二十位(耳机向)
  9. 互联网日报 | 微博热搜榜被暂停更新一周;陆正耀辞任神州租车董事会主席;教育部严格国际学生申请资格...
  10. 怎样解决张力控制的难点?
  11. 近期活动盘点:数据院五周年系列活动之医疗专场、DeeCamp2019:实战AI 铸造定雨神针...
  12. Scrapy ip代理无响应
  13. drupal安装教程 linux,linux:搭建Drupal
  14. ffmpeg截取mp3指定时间的内容
  15. java通过poi-tl模板引擎生成表格(Word)
  16. “抖音短视频”产品需求文档
  17. 如何看一篇论文的基金支持项目和获奖研究项目?
  18. 【体系结构】第三章——输入输出系统
  19. 那些年_被热播剧误解了的码农们
  20. 微软网站为什么那么慢_为什么现在那么多公司选择响应式网站建设

热门文章

  1. 大数加法(使用结构体)
  2. 采集微信公众号文章只需几步(非搜狗微信)
  3. 关于mysql初次部署后无需密码即可使用root登录问题
  4. 安东尼罗宾--激发你的无限潜能[连载]--15 16章
  5. C#/Unity不允许发送UDP到255.255.255.255的解决方法
  6. matlab 呼吸灯,STM32的呼吸灯.doc
  7. android随笔25——搜索框输入内容后界面的隐藏逻辑
  8. 臻图信息积极搭建智慧社区功能模块,推进智慧城市发展建设
  9. 墨迹天气总显示内部服务器更新,墨迹天气常见问题之无法更新版本的解决
  10. FPGA和CPLD芯片选型介绍(一)