访问器属性, IE8+新添加的语言特征,允许用户在赋值或取值都经过预先设定的函数,从而实现内部属性 的那一种特殊效果。比如说我们能让一个属性无法赋值,取值时都返回1000;让一个属性在赋值时,会执行另一处的方法……
现在javascript有三种方式设置访问器属性
HTMLElement.prototype.__defineGetter__( "description" , function () { |
HTMLElement.prototype.__defineSetter__( "description" , function (val) { |
document.body.description = "Beautiful body" |
这三种定义方式,无法哪一种,都要求我们设置一个读方法getter,一个写方法setter。 getter, setter是用于改写用户访问某属性的行为。
一般来说,我们对某属性的常用操作有如下四种,赋值,取值,遍历,删除。赋值会其内部的set方法, 取值会调用其内部的get方法, 遍历关系到其enumerable配置项,删除关系到其configurable配置项。一般地,我们称那些用户赋什么值返回什么值的属性为普通属性, 在set, get关键字,或__defineSetter__, __defineGetter__没出来之前,大多数对象的属性都是普通属性。 只有像数组的length属性与元素节点的innerHTML, 会在用户取值或赋值做一些额外的操作,它们就是访问器属性。 avalon.define生成的VM就是一个包含了是访问器属性的魔术对象。 avalon会在它们的setter,getter方法做依赖收集与同步视图等工作, 从来让我们就算不写一行有关DOM操作的代码,也能做jQuery那种灵活操作DOM的效果。