Flash CS3 文档 |
|||
| ActionScript 2.0 语言参考 > ActionScript 类 > Object > addProperty(Object.addProperty 方法) | |||
创建一个 getter/setter 属性。当 Flash 读取 getter/setter 属性时,它调用 get 函数,而该函数的返回值将成为 name 的值。当 Flash 写入 getter/setter 属性时,它调用 set 函数,并且将新值作为参数传递给该函数。如果具有给定名称的属性已经存在,新属性将覆盖该属性。
“get”函数是一个不带参数的函数。它的返回值可以为任何类型。它的类型可以在两次调用之间改变。返回值视作该属性的当前值。
“set”函数带一个参数,即该属性的新值。例如,如果属性 x 由语句 x = 1 进行赋值,则会将数字类型的参数 1 传递给 set 函数。忽略 set 函数的返回值。
可以向原型对象添加 getter/setter 属性。如果向一个原型对象添加 getter/setter 属性,则继承此原型对象的所有对象实例都将继承 getter/setter 属性。这样就能够在一个位置(即原型对象)中添加 getter/setter 属性,然后使它传播到类的所有实例(与向原型对象中添加方法相似)。如果为继承的原型对象中的 getter/setter 属性调用 get/set 函数,则传递给该 get/set 函数的引用是最初引用的对象,而不是该原型对象。
如果调用不正确,则 Object.addProperty() 可能出错失败。下表说明了可能发生的错误:
|
出错条件 |
后果 |
|---|---|
|
|
返回 |
|
|
返回 |
|
|
返回 |
可用性:ActionScript 1.0、Flash Player 6 ― 在 ActionScript 2.0 类中,可以使用 get 或 set 代替此方法。
name:String ― 一个字符串;要创建的对象属性的名称。
getter:Function ― 被调用以检索属性值的函数;此参数是一个 Function 对象。
setter:Function ― 被调用以设置属性值的函数;此参数是一个 Function 对象。如果向此参数传递 null 值,则该属性为只读。
Boolean ― 一个布尔值:如果成功创建属性,则为 true;否则为 false。
在下面的示例中,对象具有两个内部方法:setQuantity() 和 getQuantity()。当设置或检索了属性 bookcount 后,该属性可用于调用这些方法。第三个内部方法 getTitle() 返回一个与属性 bookname 关联的只读值。当脚本检索 myBook.bookcount 的值时,ActionScript 解释程序将自动调用 myBook.getQuantity()。当脚本修改 myBook.bookcount 的值时,该解释程序调用 myObject.setQuantity()。bookname 属性不指定 set 函数,因此忽略修改 bookname 的尝试。
function Book() {
this.setQuantity = function(numBooks:Number):Void {
this.books = numBooks;
};
this.getQuantity = function():Number {
return this.books;
};
this.getTitle = function():String {
return "Catcher in the Rye";
};
this.addProperty("bookcount", this.getQuantity, this.setQuantity);
this.addProperty("bookname", this.getTitle, null);
}
var myBook = new Book();
myBook.bookcount = 5;
trace("You ordered "+myBook.bookcount+" copies of "+myBook.bookname);
// output: You ordered 5 copies of Catcher in the Rye
上一个示例将正常运行,但将属性 bookcount 和 bookname 添加到 Book 对象的每个实例,这就要求对象的每个实例都拥有这两个属性。如果类中有许多属性(如 bookcount 和 bookname,),它们可能占用大量的内存。相反,您可以将这些属性添加到 Book.prototype,以便 bookcount 和 bookname 属性仅存在于一个位置中。但是,它的效果与示例(直接将 bookcount 和 bookname 添加到每一个实例)中代码的效果相同。如果尝试访问 Book 实例中的任一属性,则在该属性不存在时,会导致原型链上升,直到遇到在 Book.prototype 中定义的版本。下面的示例演示如何将属性添加到 Book.prototype:
function Book() {}
Book.prototype.setQuantity = function(numBooks:Number):Void {
this.books = numBooks;
};
Book.prototype.getQuantity = function():Number {
return this.books;
};
Book.prototype.getTitle = function():String {
return "Catcher in the Rye";
};
Book.prototype.addProperty("bookcount", Book.prototype.getQuantity, Book.prototype.setQuantity);
Book.prototype.addProperty("bookname", Book.prototype.getTitle, null);
var myBook = new Book();
myBook.bookcount = 5;
trace("You ordered "+myBook.bookcount+" copies of "+myBook.bookname);
下面的示例演示如何使用 ActionScript 2.0 中提供的隐式 getter 和 setter 函数。您可以在名为 Book.as 的外部文件中定义 Book 类,而不必定义 Book 函数并编辑 Book.prototype。下面的代码必须位于名为 Book.as 的单独外部文件中,该文件只包含此类定义并且位于 Flash 应用程序的类路径中:
class Book {
var books:Number;
function set bookcount(numBooks:Number):Void {
this.books = numBooks;
}
function get bookcount():Number {
return this.books;
}
function get bookname():String {
return "Catcher in the Rye";
}
}
然后,可以将下面的代码置于 FLA 文件中,这些代码的运行方式与在前几个示例中的运行方式相同:
var myBook:Book = new Book();
myBook.bookcount = 5;
trace("You ordered "+myBook.bookcount+" copies of "+myBook.bookname);
Flash CS3
当前页: http://livedocs.adobe.com/flash/9.0_cn/main/00002036.html