Flash AS学习:构造函数小结

函数

  一、构造函数的差别性

  构造函数是一个特殊的成员函数,与成员函数具有共同性和差别性。例如:构造函数与成员函数一样,通过function关键字来定义,可以声明为private或public,可以在构造函数中加入参数等。
一、构造函数的差别性主要体现在:
l    构造函数名与类名必须相同,并且区分大小写;
l    构造函数不能声明为static,它只能是private或public;
l    构造函数中不能使用return语句返回一个值;
l    构造函数不能返回指定的数据类型;
当违反以上规则时,flash会在输出面板提示相应的信息。
1、在下面的Load类我们定义一个成员函数load:

class Load { 
    function load() { 
    } 

进行语法检查时,flash会提示以下的信息:
成员函数“load”与定义的类的名称“Load”大小写不同,在运行时将被视为类构造函数。
2、如果我们在构造函数中声明了static属性:

class Load { 
    static function Load() { 
    } 

flash将提示:
允许用于构造函数的属性只有 public 和 private
3、如果我们在构造函数中使用了return语句返回一个值:

class Load { 
    var i = 0; 
    function Load() { 
        return i; 
    } 

flash将提示:
构造函数不能返回值
4、如果我们在构造函数中返回了一个数据类型:

class Load { 
    function Load():Load { 
    } 

flash将提示:
构造函数不能指定返回类型

  二、构造函数的返回值

  虽然在构造函数中不能用return返回一个值,但构造函数有返回值,它返回的是为该类的实例。
如:

class Load { 
    function Load() { 
    } 
    function toString():String { 
        return "Load类的实例"; 
    } 

测试方法:

trace(new Load()); 
在输出面板中输出:
Load类的实例
在类中加入toString方法的原因:
当Load类的对象作为字符串对待时,toString()方法会自动调用,这个方法在使用trace()调试类的属性、实例等时非常有用,所以在有构造函数的类里面,一般都配有toString()方法,位置放在构造函数的后面。
如果没有toString()方法,测试结果可不是我们想要:
[object Object]
在创建类的实例时,一般都要指定一个实例名:
var t:Load = new Load();
以上的代码的执行过程:
l    创建一个Load类的对象,并为该对象分配存储空间。
l    调用Load类的构造函数,初始化这个新建的对象。
l    声明一个Load类的实例的引用t即实例名,使其指向这个新的对象。
通过实例名就可以使用实例属性和实例方法:
实例名.属性
实例名.方法名()

  三、构造函数的参数传递

  当用构造函数创造类的实例时,常常要初始化一些类的属性,这些属性通常用构造函数的参数来传递。

class ToolTip {    
    private var _str:DrawString;    
    private var _shape:Shape;    
    public function ToolTip(str:DrawString, shape:Shape) {
        _str = str;
        _shape = shape;
    }
//设置和获取属性的代码
}
  如果参数名与属性名相同,可以使用this关键字来指向类的实例,通过点语法把参数传递进来:

class ToolTip {    
    private var str:DrawString;    
    private var shape:Shape;    
    public function ToolTip(str:DrawString, shape:Shape) {
        this.str = str;
        this.shape = shape;
    }
}
  使用:

var t:ToolTip=new ToolTip(str, rect);
  在构造函数的参数传递中,也存在着地址传递和数值传递的问题,这特别要引起注意。如下面两个参数不同传递方式的例子:
  地址传递:

class Box {
    function Box(a:Array) {
        a[0] = 5;
        trace(a[0]);
    }
}
var a = ["1"];
var t:Box = new Box(a);
trace(a[0]);
//5
//5
  数值传递:

class Box { 
    function Box(a) { 
        a = 5; 
        trace(a); 
    } 

var a = 1 
var t:Box = new Box(a); 
trace(a); 
//5 
//1
  关于参数传递的原理可参考书
  在as2中,不支持构造函数的重载,即在一个类中定义多个构造函数,但可以通过条件语句进行模拟(实际上只有一个构造函数),通过对参数的判断如参数的类型的检查来执行不同的代码。在flash中,Array类的构造函数可以接受不同的参数,产生不同的实例,我想实现方法应与此类似。

  四、空构造函数和私有构造函数

  如果在一个类里含有一个空构造函数(默认是public的,见上面的第1个例子),意为这个类不需要初始化,因为一个类的初始化代码一般都放在构造函数中。但空构造函数也有可能是一个没有完成的构造函数,在编写其它类代码后,将会在构造函数中补充代码,这也是编程常用的方法。
  在一个类里面,如果没有定义构造函数,as2会创建一个空构造函数,所以一个空构造函数在as2里意义不大,但如果一个空构造函数被声明为private,它就具有重大的意义。
  1、抽象类中的私有构造函数
  首先私有构造函数能保证不能在外部通过new关键字被实例化,因为抽象类被实例化是没有意义的。在抽象类里面,一般定义了子类所需的统一方法,而抽象类本身只做为一个统一的数据类型使用,它的实例化都要延迟到子类。
  例如:在flash的绘图中,颜色填充的方式有三种:固体填充、直线渐变填充和放射渐变填充。如果我们要写一个填充类,最好的方法是先创建一个抽象类,让三种具体的填充类来继承这个抽象类,这样,三个具体类就具有了相同的数据类型和统一的接口方法。
  下面是代码示例:

//抽象类
class Brush {
    private function Brush() {
    }
    public function fill(target:MovieClip) {
    }
}
//固体填充类
class SolidBrush extends Brush {    
    function SolidBrush(color, alpha) {        
    }
    public function fill(target:MovieClip) {        
    }
}
//直线渐变填充类
class LinerBrush extends Brush {    
    function LinerBrush(参数) {        
    }
    public function fill(target:MovieClip) {        
    }
}
  使用可把实例名的类型定义为Bursh,但具体的实例可以是三个里面的任意一个:
var b:Brush=new SolidBrush();
b.fill();
//
var b:Brush=new LinerBrush ();
b.fill();
  2、具体类中的私有构造函数
  这种情况最常见的是在单例模式中,在单例模式中,一个类只能自己创建一个唯一的实例。如下面是一个代码示例:

class Load {
    private static var _instance:Load;
    private function Load() {
    }
    public static function getInstance():Load {
        if (Load._instance == undefined) {
            return Load._instance=new Load();
        }
    }
}
  使用:

var t:Load=Load.getInstance()

时间: 2024-08-22 05:13:33

Flash AS学习:构造函数小结的相关文章

Flash怎样学习鼠绘

  "Flash动画鼠绘入门班"第一课教材--认识鼠绘 序言 针对网络学员以初学电脑作图为多的特点,为使学员了解认识鼠绘的慨念.学习的目的及有关方法,为培养学习鼠绘的兴趣,树立信心,为继续深入学习鼠绘奠定基础而举办本期鼠绘入门班.因此本期鼠绘班不同于以往的鼠绘教材.它的宗旨就是领你入门. 第一课的主要内容: 1.闲话鼠绘 2.怎么样学习鼠绘 3.认识软件 一.闲话鼠绘 1.首先认识一下鼠绘: (1)鼠绘的概念:在电脑上用鼠标控制相关软件绘制的画; (2)鼠绘与纸画的不同之处:鼠绘的可修

Flash从零开始学习创建单选按钮

核心提示:Flash从零开始学习创建单选按钮教程. 我们将使用画图工具和ActionScript 3.0中的时间轴,鼠标事件做一个好看的单选按钮. 最终预览 我们先看一下最终作品: 第一步:概述 一个单选按钮或选项按钮是一个图形用户界面元素,允许用户只选择一个预定义的选项集的类型. 在这个教程中,我们将创建一个传统的单选按钮. 第二步:设置Flash 打开Flash创建一个新文档,舞台大小设为320*190,颜色为#181818 ,帧频为 24fps. 第三步:界面 这是我们将要使用的界面:一个

Flash/Flex学习笔记(5):捕获摄像头(续)--在线抓屏并保存到客户端本地

必须有摄像头上面的演示才能正常播放. 思路 使用摄像头以及在线抓屏在上一节Flash/Flex学习笔记(2)捕获摄像头 里已经讲过了就不重复粘贴了至于在客户端保存文件Flash里用起来也很简单:直接调用 FileReference 即可另外为了减少图片大小还可能借助AS3.0的扩展库项目地址http://code.google.com/p/as3corelib/把bmp格式的位置转换成jpeg再保存   扩展 结合本文的方法再配合Flash/Flex学习笔记(4)如何打开网页及Get/Post数

MySql存储过程学习知识小结_Mysql

什么是存储过程: 存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了. 存储过程的好处: 1.由于数据库执行动作时,是先编译后执行的.然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高. 2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率. 3.通过存储过程能够使没有权限的

Flash/Flex学习笔记(37):不用系统组件(纯AS3)的视频播放器--只有8.82K

以前为了赶项目,利用系统组件制作过一款视频播放器(见Flash/Flex学习笔记(6):制作基于xml数据源的flv视频播放器),但是系统组件实在是太大了,最终生成的swf居然有103K,随着AS3的深入学习,昨天又弄了一个只用AS3的播放器,最终只有8.82K,呵呵,这肥减得那是相当厉害. 用到了上一篇(Flash/Flex学习笔记(35):自己动手实现一个滑块控件(JimmySilder))里自己写的的滑块控件,主要代码如下(关键是NetConnection与NetStream对象的使用):

Flash/Flex学习笔记(57):实用技巧

布朗运动: varnumDots:uint=50; varfriction:Number=0.9; vardots:Array; varlife:uint=0; functioninit(){ graphics.lineStyle(0,0xffffff,.5); dots=newArray(); for(vari:uint=0;i<numDots;i++){ vardot:Ball=newBall(2,0x00ff00); dot.x=Math.random()*stage.stageWidth

Flash/Flex学习笔记(46):正向运动学

所谓"正向运动学"通俗点讲就是把几个连接部件的一端固定起来,另一个端可以自由(向前/向外)运动.比如人的行走,单个下肢可以理解为脚连接小腿,小腿连接大腿,大腿连接腰.行走的过程,相当于二条腿相对固定于腰部,大腿运动驱动小腿,小腿又驱动脚,从而带动整个连接系统的一系列运动. 先来一个基本的关节类Segment:(就是一个圆角矩形+二个小圆圈) package { import flash.display.Sprite; import flash.geom.Point; public cl

Flash/Flex学习笔记(24):粒子效果

粒子爆炸: 仍然要用到以前的小球类,不过稍加改造 package { import flash.display.Sprite; //小球 类 public class Ball extends Sprite { public var radius:uint;//半径 public var color:uint;//颜色 public var vx:Number=0;//x轴速度 public var vy:Number=0;//y轴速度 public function Ball(r:Number

Flash/Flex学习笔记(25):摩擦力与屏幕环绕

摩擦力: 假如一个物体在某个方向上沿直线运行,摩擦力会使该方向上的速度越来越小,直到停止. 上图示意了该过程,物体以moveAngle角度正向运动,最终的速度speed矢量为vx矢量与vy矢量的矢量和,在每个单位时间内的位移即Speed矢量的大小,分解到x,y轴后,即为vx与vy:加入摩擦力后,speed矢量每单位时间将减少Friction值,也就是视觉上的越来越慢. var ball:Ball = new Ball(10); ball.x = stage.stageWidth/2; ball.

Flash/Flex学习笔记(30):不用startDrag和stopDrag的对象拖动

对于从Sprite类继承来的对象,要实现拖放当然是Flash/Flex学习笔记(13):对象拖动(startDrag/stopDrag) 里讲的方法最方便,但是对于不是从Sprite类继承得来的对象,这startDrag/stopDrag是不能用的,这时候只能采用最通常用做法:利用Mouse_Down,Mouse_UP,Mouse_Move事件来处理 注意:对象的Mouse_Move事件,只有当鼠标在对象上时才能被监听,如果用户鼠标移动过快,超出了对象的范围,该事件就不起作用了,所以监听Mous