JavaScript 属性定义方法详解:Object.defineProperty 与 __defineGetter__

作者:闭包旅人时间:2026-10-29 17:19:59浏览:73

本文介绍了 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 属性定义方法的学习小结,后续将继续每日更新,敬请持续关注。

作者最新文章