JavaScript中Get和Set访问器的三种实现方式详解

作者:小括号

时间:2026-10-26

浏览:657

本文详细解析JavaScript中Get和Set访问器的三种实现方案,包括ES5标准下的Object.defineProperty方法、__defineGetter/__defineSetter方法以及传统闭包实现。重点分析各方法在IE8+、Chrome 5.0+等浏览器中的兼容性差异,并对比DOM元素与普通对象的应用场景,帮助开发者根据实际需求选择最佳实践。

文章目录

JavaScript中Get和Set访问器的三种实现方式详解

本文介绍标准的Get和Set访问器的具体实现方法。


参考以下代码示例:

 
function Field(val){
this.value = val;
} 
Field.prototype = {
get value(){
return this._value;
}, 
set value(val){
this._value = val;
} 
}; 
var field = new Field("test");
field.value="test2";
//field.value will now return "test2"

标准对象访问器实现

上述代码在以下浏览器环境中可以正常运行:


JavaScript中Get和Set访问器的三种实现方式详解

我们通常采用的另一种实现思路如下所示:

具体代码实现如下:

 
function Field(val){
var value = val;
this.getValue = function(){
return value;
}; 
this.setValue = function(val){
value = val;
}; 
} 
var field = new Field("test");
field.setValue("test2")
field.getValue() // return "test2"

DOM元素访问器实现

接下来探讨在DOM元素上实现Get和Set访问器的方法。


相关代码示例如下:

 
HTMLElement.prototype.__defineGetter__("description", function () {
return this.desc;
}); 
HTMLElement.prototype.__defineSetter__("description", function (val) {
this.desc = val;
}); 
document.body.description = "Beautiful body";
// document.body.description will now return "Beautiful body";

该方法在以下浏览器中有效:


JavaScript中Get和Set访问器的三种实现方式详解

 

Object.defineProperty方法应用

利用Object.defineProperty方法来实现访问器是未来的趋势。

未来ECMAScript标准扩展对象的方法将通过Object.defineProperty来实现。这也是为什么IE8通过这种方法来实现get和set访问器的原因,可见微软具有前瞻性。遗憾的是,目前仅有IE8+和Chrome 5.0+支持此特性,其他浏览器尚不支持。此外,IE8+仅支持DOM元素,但未来版本预计将像Chrome一样支持普通JavaScript对象。

在DOM元素上应用Get和Set访问器的代码如下:

 
Object.defineProperty(document.body, "description", {
get : function () {
return this.desc;
}, 
set : function (val) {
this.desc = val;
} 
}); 
document.body.description = "Content container";
// document.body.description will now return "Content container"

该代码在以下浏览器中能正常工作:

JavaScript中Get和Set访问器的三种实现方式详解

普通对象访问器实现

以下是普通对象中Get和Set访问器的实现方式。


具体代码示例如下:

 
var lost = {
loc : "Island"
}; 
Object.defineProperty(lost, "location", {
get : function () {
return this.loc;
}, 
set : function (val) {
this.loc = val;
} 
}); 
lost.location = "Another island";
// lost.location will now return "Another island"

该实现在以下浏览器中可用:

JavaScript中Get和Set访问器的三种实现方式详解

文章总结部分。

尽管微软的IE仅支持了Object.defineProperty,并未完美实现Get和Set访问器,但我们已看到IE的巨大进步。特别是新发布的IE9采用了新的JavaScript引擎,支持HTML5和CSS3以及硬件加速等功能。相信终有一天,各浏览器都能完全拥抱标准,带来一个完美的WEB世界。

参考文献:

1. Getters and setters with JavaScript 2. JavaScript Getters and Setters 作者:梦想

实用工具推荐

电子包浆

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

使用 ›
图片压缩

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

使用 ›
相关文章