Flash Player 6。在外部类文件中,您可以使用 get 或 set 来代替此方法。
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()
可能出错并失败。下表描述了可能发生的错误:
出错条件 |
后果 |
---|---|
|
返回 |
|
返回 |
|
返回 |
用法 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:上述示例中的 bookcount
和 bookname
正常工作,但将属性 bookcount
和 bookname
添加到 Book
对象的每个实例中。这意味着要拥有这些属性,该对象的每个实例都必须具有两个属性位置。如果类中有许多像 bookcount
和 bookname
这样的属性,则它们可能占用大量的内存。为避免这种情况,可以向 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;
现在,bookcount
和 bookname
属性只存在于一个地方:Book.prototype
对象。但是效果与用法 1 中的代码相同,用法 1 将 bookcount
和 bookname
直接添加到每个实例。如果访问 Book
实例中的 bookcount
或 bookname
,则上溯原型链并找到 Book.prototype
中的 getter/setter 属性。
用法 3:内置属性 TextField.scroll 和 TextField.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.scroll
和 TextField.maxscroll
在用法 3 示例中可以发挥作用,但会将属性 scroll
和 maxscroll
添加到 TextField 对象的每个实例中。这意味着拥有这些属性,则该对象的每个实例都必须具有两个属性位置。如果类中有许多像 scroll
和 maxscroll
这样的属性,则它们可能占用大量的内存。为避免这种情况,可以向 TextField.prototype
添加 scroll
和 maxscroll
属性:
TextField.prototype.addProperty("scroll", this.getScroll, this.setScroll); TextField.prototype.addProperty("maxscroll", this.getMaxScroll, null);
现在,scroll
和 maxscroll
属性只存在于一个地方:TextField.prototype
对象。但是效果与
上面的代码相同,上面的代码将 scroll
和 maxscroll
直接添加到每个实例。如果访问
TextField 实例中的 scroll
或 maxscroll
,则上溯原型链并找到 TextField.prototype
中的 getter/setter 属性。