JavaScript对象中的访问器属性

环境:支持ECMAScript 5 及以上的浏览器

条件:必须通过Object.defineProperty或者Object.defineProperties添加

语法

    Object.defineProperty( '目标对象',  '属性名', {get: function() {},  set: function() {}} );

    Object.defineProperties( '目标对象',  {'属性对象集'} );

特性

 

  • [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。对于直接在对象上定义的属性,这个特性的默认值为true。 
  • [[Enumerable]]:表示能否通过 for-in 循环返回属性。对于直接在对象上定义的属性,这个特性的默认值为 true。
  • [[Get]]:在读取属性时调用的函数。默认值为 undefined。
  • [[Set]]:在写入属性时调用的函数。默认值为 undefined。

历史遗留:在这个方法之前,要创建访问器属性,一般都使用两个非标准的方法:__defineGetter__()和__defineSetter__()。这两个方法最初是由 Firefox 引入的,后来 Safari 3、Chrome 1 和 Opera 9.5 也给出了相同的实现。使用这两个遗留的方法,可以像下面这样写

//定义访问器的旧有方法

目标对象.__defineGetter__( "属性", function(){} );

目标对象.__defineSetter__( "属性", function(value){} );

相关:数据属性——包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有 4 个描述其行为的特性。

 

  • [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。这个特性默认值为 true。
  • [[Enumerable]]:表示能否通过 for-in 循环返回属性。这个特性默认值为 true。
  • [[Writable]]:表示能否修改属性的值。这个特性默认值为 true。
  • [[Value]]:包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。这个特性的默认值为 undefined。

注意事项

 

  • 通过defineProperty或defineProperties方法定义configurable特性后,属性的特性除writable外都将不可修改,尝试修改在非严格模式直接忽略,在严格模式下会报错。
  • 不一定非要同时指定 getter 和 setter。只指定 getter 意味着属性是不能写,尝试写入属性会被忽略。在严格模式下,尝试写入只指定了 getter 函数的属性会抛出错误。类似地,只指定 setter 函数的属性也不能读,否则在非严格模式下会返回 undefined,而在严格模式下会抛出错误。
  • Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符。这个方法接收两个参数:属性所在的对象和要读取其描述符的属性名称。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章