Flash5ActionScript教程 四十二
b>使用自定义对象Flash 5允许用户创建自定义对象,用它来组织某类信息。通过定义该对象的属性和方法,在脚本中就可以很方便地存取其中的信息。在创建主对象或“类”后,你就可以在动画中使用或“实例化”该对象的副本(也就是该对象的实例)。这样,你就可以重用代码,因而减小文件的大小。
对象是一种复杂的数据类型,可以包含多种属性。象变量一样,每种属性都拥有名称和值。属性附属于对象,其值可以被修改和存取。属性的值可以是字符型、数值型、逻辑型、对象、电影剪辑或未定义型。下面的属性属于不同的数据类型:
customer.name = "Jane Doe";
customer.age = 30;
customer.member = true;
customer.account.currentRecord = 000609;
customer.mcInstanceName._visible = true;
对象的属性也可以是另一个对象。在上例中的第4行, account是对象customer的属性,currentRecord是对象account的属性。currentRecord属性的数据类型是数值型。或者说,account本身是个对象,它拥有自己的属性currentRecord;account对象也属性,它附属于customer对象。
创建对象
可以用new操作符从构造函数(或称结构体函数)创建对象。构造函数的名字总是与所创建的对象相同。 例如,用来创建account(帐号)对象的结构体的名字应该是Account。下面的语句从称为 MyConstructorFunction的构造函数创建一个新的对象:
new MyConstructorFunction (argument1, argument2, ... argumentN);
当 MyConstructorFunction函数被调用时,Flash给它传递一个隐藏的参数this,这个参数是对MyConstructorFunction正在创建的对象的引用。当你定义一个结构体时,参数this使你能够引用该结构体将要创建的对象。例如,下面的函数就是创建circle对象的构造函数:
function Circle(radius) {
this.radius = radius;
this.area = Math.PI * radius * radius;
} 构造函数常常被用来填写对象的方法:
function Area() {
this.circleArea = MAth.PI * radius * radius;
} 要在脚本中使用一个对象,必须把该对象赋给一个变量。要创建一个新的半径是5的圆对象,使用new操作符创建该对象,并把它赋给局部变量myCircle:
var myCircle = new Circle(5);
注:对象的作用范围与所赋给的变量的作用范围相同。
创建继承
在Flash 5中,所有函数都有一个prototype(原型)属性,该属性在定义函数时自动创建。当使用构造函数创建新的对象时,该结构体的prototype属性的所有属性和方法变成了新对象的__proto__属性的属性和方法。 prototype属性指明了用该函数创建的对象的默认属性值。使用__proto__和prototype属性传递值就称为继承。
继承根据明确的等级进行。当调用对象的属性或方法时,动作脚本首先查看该对象是否拥有该元素。如果该元素不存在,动作脚本查看该对象的__proto__属性以获得相应的信息(对象.__proto__)。如果被调用的属性不是该对象的__proto__对象的属性,动作脚本查看对象.__proto__.__proto__。
通过把方法赋给对象的prototype属性的方式把方法指派给对象是一种常见的做法。下面的步骤说明怎样定义一个范例方法:
1 | 定义构造函数Circle(圆): |
function Circle(radius) { this.radius = radius; } | |
2 | 定义Circle对象的area(面积)方法。area方法将计算circle的面积。你可以使用函数常量(如下例中的 Math.PI)来定义area方法,并设置该圆的原型对象的面积属性: |
Circle.prototype.area = function () { return Math.PI * this.radius * this.radius; } | |
3 | 创建Circle对象的实例: |
var myCircle = new Circle(4); | |
4 | 调用新的myCircle对象的area方法,如下所示: |
var myCircleArea = myCircle.area() | |
动作脚本查找myCircle对象的area方法。因为该对象没有area方法,所以就查找它的原型对象 Circle.prototype的area方法。动作脚本找到它,并调用它。 | |
也可以通过把方法指派给对象的各个实例的方式,把方法指定给对象,如下例所示:
function Circle(radius) {
this.radius = radius;
this.area = function() {
return Math.PI * this.radius * this.radius;
}
} 这种技术一般不推荐使用。通常,使用prototype对象更有效,因为仅需定义一个area,且该定义被自动拷贝到 Circle函数创建的所有实例中。
prototype属性需要Flash 5和或更高版本支持。