本文介绍JavaScript中定义对象属性读取器和写入器的两种主要方式。第一种是在对象字面量初始化时使用get和set关键字;第二种是通过__defineGetter__和__defineSetter__方法在对象创建后动态添加。文章通过Date对象和HTMLElement原型扩展示例,展示了如何为现有对象或内置对象追加自定义的getter和setter逻辑,并对比了两种方式的适用场景。
Getter与Setter的基本概念
Getter是用于获取属性值的方法,Setter则是用于设置属性值的方法。通过为预定义的核心对象或用户自定义对象定义这两种方法,可以为现有对象添加新的属性行为。
在JavaScript中,定义Getter或Setter方法主要有两种方式。
第一种方式是在对象初始化阶段直接定义;第二种方式则是在对象定义完成后,利用Object的__defineGetter__和__defineSetter__方法进行追加定义。
在对象初始化过程中定义Getter和Setter时,关键操作是在getter方法名前添加“get”关键字,在setter方法名前添加“set”关键字。
需要注意的是,getter方法不接受任何参数,而setter方法必须接收一个参数,该参数代表要设置的属性新值。
对象初始化时定义Getter和Setter
以下是一个具体的代码示例。
代码如下:
o = {
value:9,
get b() {return this.value;},
set setter(x) {this.value = x;}
}
使用__defineGetter__和__defineSetter__追加定义
当需要在对象定义之后为其添加getter或setter方法时,可以使用__defineGetter__和__defineSetter__这两个特殊方法。这两个函数要求第一个参数为getter或setter的名称(以字符串形式提供),第二个参数为实际的getter或setter函数。
例如,我们可以给Date对象添加一个year属性:
代码如下:
Date.prototype.__defineGetter__('year', function() {return this.getFullYear();});
Date.prototype.__defineSetter__('year', function(y) {this.setFullYear(y)});
var now = new Date;
alert(now.year);
now.year = 2006;
alert(now);
选择哪种形式主要取决于编程风格。第一种形式结构紧凑且易于理解。然而,如果需要在对象定义后添加Getter或Setter,或者该对象的原型并非由你编写(如内置对象),则必须采用第二种方式。
实例:为HTMLElement添加innerText属性
下面是一个为Mozilla浏览器添加innerText属性的实现示例:
代码如下:
HTMLElement.prototype.__defineGetter__
(
"innerText",function()
//define a getter method to get the value of innerText,
//so you can read it now!
{
var textRange = this.ownerDocument.createRange();
//Using range to retrieve the content of the object
textRange.selectNodeContents(this);
//only get the content of the object node
return textRange.toString();
// give innerText the value of the node content
}