JavaScript 属性定义方法详解:Object.defineProperty 与 __defineGetter__
本文介绍了 JavaScript 中定义属性的两种主要方式:Object.defineProperty 和 __defineGetter__/__defineSetter__。前者通过属性描述符对象精确控制属性的特性(如可写性、可枚举性),是 ES5 标准推荐方式;后者为遗留的访问器属性定义方法,虽功能相似但已不再推荐使用。文章通过具体代码示例展示了如何为对象添加带有 getter 和 setter 逻辑的属性,并对比了两种方法的实现细节。
使用 Object.defineProperty 定义属性
定义属性需要使用特定的函数,例如 Object.defineProperty(obj, "prop", propDesc)。当对象 obj 尚不存在名为 prop 的自身属性时,该函数的作用是向 obj 添加一个名为 prop 的自身属性并赋值。参数 propDesc 用于指定该属性所具备的特性,包括可写性、可枚举性等。若对象 obj 已拥有名为 prop 的自身属性,则该函数的作用是修改该已有属性的特性,同时也包括修改其属性值。
var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book, "year", {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005;
alert(book.edition); //2
使用 __defineGetter__ 和 __defineSetter__ 定义属性
除了 Object.defineProperty,JavaScript 还提供了 __defineSetter__ 和 __defineGetter__ 两种方法。
var book = {
_year: 2004,
edition: 1
};
//legacy accessor support
book.__defineGetter__("year", function(){
return this._year;
});
book.__defineSetter__("year", function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
});
book.year = 2005;
alert(book.edition); //2
以上为本次关于 JavaScript 属性定义方法的学习小结,后续将继续每日更新,敬请持续关注。
什么时候该用JS构造器:与工厂模式、字面量的选择对比
2026-11-05 16:18:22
推荐几款轻量级JS照片墙开源库及对比
2026-11-05 15:56:19
JavaScript递归写法有哪些常见陷阱及避免方法
2026-11-05 14:53:38
JS数组浅拷贝与深拷贝怎么选?场景与方法总结
2026-11-05 14:41:02
p5.js 中 setup() 和 draw() 函数的执行机制详解
2026-11-05 12:32:38
