[关闭]
@frank-shaw 2017-02-09T08:33:17.000000Z 字数 1054 阅读 1353

JavaScript对象中属性的特征

javaScript


ECMA-262将对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”现在来聊聊对象中的各个属性所持有的一些特征。属性的特征主要有两种:数据特征、访问器特征。

数据特征

数据特征具体包含了四个:

  1. [[Configurable]]:该属性是否可删除、是否可修改该属性的特征(起到一个统帅的作用)默认true
  2. [[Enumerable]]:该属性是否可以通过for-in循环返回 默认true
  3. [[Writable]]:表示属性是否可写入(可修改)默认true
  4. [[Value]]:表示的是属性具体的值 默认undefined

下面来看例子:

  1. var person={}
  2. Object.defineProperty(person, "name", {
  3. writable:false,
  4. value:"frank"
  5. });
  6. alert(person.name);//'frank'
  7. person.name='kobe';
  8. alert(person.name);//'frank'

在定义对象属性的时候,赋予name属性的value特征为‘frank',同时writable特征为false。表明person.name是不可修改的。

访问器特征

访问器特征具体包含了四个:

  1. [[Configurable]]:该属性是否可删除、是否可修改该属性的特征(起到一个统帅的作用)默认true
  2. [[Enumerable]]:该属性是否可以通过for-in循环返回 默认true
  3. [[Get]]:在读取该属性时调用的函数 默认undefined
  4. [[Set]]:在写入该属性时调用的函数 默认undefined

同样看例子:

  1. var book = {
  2. _year:2016,
  3. edition:1
  4. }
  5. Object.getProperty(book,"year",{
  6. get: function(){
  7. return this._year;
  8. },
  9. set: function(newValue){
  10. if(newValue>2016){
  11. this._year=newValue;
  12. this.edition += newValue-2016;
  13. }
  14. }
  15. });
  16. book.year=2017;
  17. alert(book.edition); //2

值得注意的是:
1.不一定非要同时制定getter和setter。只指定getter意味着该属性不能写,尝试写入会被忽略。反之亦然。
2.如果要同时定义多个属性,那么可以使用Object.defineProperties(obj, {}, {});

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注