Object.addProperty()

可用性

Flash Player 6。在外部类文件中,您可以使用 getset 来代替此方法。

用法

myObject.addProperty(prop, getFunc, setFunc)

参数

prop 要创建的对象属性的名称。

getFunc 被调用以获取属性值的函数;此参数是一个函数对象。

setFunc 被调用以设置属性值的函数;此参数是一个函数对象。如果向此参数传递 null 值,则该属性为只读。

返回

如果属性创建成功,则返回值为 true;否则,返回 false

说明

方法;创建一个 getter/setter 属性。当 Flash 读取 getter/setter 属性时,它调用 get 函数,而该函数的返回值成为 prop 的值。当 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() 可能出错并失败。下表描述了可能发生的错误:

出错条件

后果

prop 不是有效的属性名;例如,一个空字符串。

返回 false,而且不添加该属性。

getFunc 不是有效的函数对象。

返回 false,而且不添加该属性。

setFunc 不是有效的函数对象。

返回 false,而且不添加该属性。

示例

用法 1:某个对象具有两个内部方法:setQuantity()getQuantity()。当设置或获取了属性 bookcount 后,该属性可用于调用这些方法。第三个内部方法 getTitle() 返回一个与属性 bookname 关联的只读值:

function Book() {  


this.setQuantity = function(numBooks) { 
this.books = numBooks; }
this.getQuantity = function() { 
  return this.books; 
} this.getTitle = function() { return "Catcher in the Rye"; } this.addProperty("bookcount", this.getQuantity, this.setQuantity); this.addProperty("bookname", this.getTitle, null); } myBook = new Book(); myBook.bookcount = 5; order = "You ordered "+myBook.bookcount+" copies of "+myBook.bookname;

当脚本获取 myBook.bookcount 的值时,动作脚本解释程序将自动调用 myBook.getQuantity()。当脚本修改 myBook.bookcount 的值时,该解释程序调用 myObject.setQuantity()bookname 属性未指定 set 函数,因此忽略修改 bookname 的尝试。

用法 2:上述示例中的 bookcountbookname 正常工作,但将属性 bookcountbookname 添加到 Book 对象的每个实例中。这意味着要拥有这些属性,该对象的每个实例都必须具有两个属性位置。如果类中有许多像 bookcountbookname 这样的属性,则它们可能占用大量的内存。为避免这种情况,可以向 Book.prototype 添加属性:

function Book () {}  
Book.prototype.setQuantity = function(numBooks) {  
  this.books = numBooks; 
} 
Book.prototype.getQuantity = function() {  
  return this.books; 
} 
Book.prototype.getTitle = function() {  
  return "Catcher in the Rye"; 
}  
Book.prototype.addProperty("bookcount", Book.prototype.getQuantity, Book.prototype.setQuantity); 
Book.prototype.addProperty("bookname", Book.prototype.getTitle, null);
myBook = new Book(); 
myBook.bookcount = 5; 
order = "You ordered "+myBook.bookcount+" copies of "+myBook.bookname;  

现在,bookcountbookname 属性只存在于一个地方:Book.prototype 对象。但是效果与用法 1 中的代码相同,用法 1 将 bookcountbookname 直接添加到每个实例。如果访问 Book 实例中的 bookcountbookname,则上溯原型链并找到 Book.prototype 中的 getter/setter 属性。 

用法 3:内置属性 TextField.scrollTextField.maxscroll 为 getter/setter 属性。
TextField 对象具有内部方法 getScroll()setScroll()getMaxScroll()。TextField 构造函数创建 getter/setter 属性,并将它们指向这些内部 get/set 方法,如下所示:

this.addProperty("scroll", this.getScroll, this.setScroll);
this.addProperty("maxscroll", this.getMaxScroll, null);

当脚本获取 myTextField.scroll 的值时,动作脚本解释程序自动调用 myTextField.getScroll()。当脚本修改 myTextField.scroll 的值时,解释程序调用 myTextField.setScroll()
maxscroll 属性未指定 set 函数,因此忽略修改 maxscroll 的尝试。

用法 4:虽然内置属性 TextField.scrollTextField.maxscroll 在用法 3 示例中可以发挥作用,但会将属性 scrollmaxscroll 添加到 TextField 对象的每个实例中。这意味着拥有这些属性,则该对象的每个实例都必须具有两个属性位置。如果类中有许多像 scroll
maxscroll 这样的属性,则它们可能占用大量的内存。为避免这种情况,可以向
TextField.prototype 添加 scrollmaxscroll 属性:

TextField.prototype.addProperty("scroll", this.getScroll, this.setScroll);
TextField.prototype.addProperty("maxscroll", this.getMaxScroll, null);

现在,scrollmaxscroll 属性只存在于一个地方:TextField.prototype 对象。但是效果与
上面的代码相同,上面的代码将 scrollmaxscroll 直接添加到每个实例。如果访问
TextField 实例中的 scrollmaxscroll,则上溯原型链并找到 TextField.prototype 中的 getter/setter 属性。