JavaScript中__defineGetter__与__defineSetter__的使用详解

作者:小括号

时间:2026-10-29

浏览:547

本文介绍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
       }

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章