可枚举性

对应有道云笔记地址(有道云上排版更优):http://note.youdao.com/noteshare?id=48a9a79bcd3f66d43f253053462296ab&sub=B84D11849DA84E2A813E09A073E30578

时间:2018.08.07
参考:https://blog.csdn.net/GXing007/article/details/79529307
https://segmentfault.com/a/1190000011294519

 

可枚举性

 

什么是可枚举性?

    对象的每一个属性都有一个描述对象,用来描述和控制该属性的行为,用Object.getOwnPropertyDescriptor方法来获取该描述对象(用Object.defineProperty方法来设置)。


eg:
  let obj = { foo: 123 };
  Object.getOwnPropertyDescriptor(obj, 'foo')
  // {
  // value: 123,
  // writable: true,
  // enumerable: true,
  // configurable: true
  // }


  描述对象的enumerable属性,称为”可枚举性“,如果该属性为false,就表示某些操作会忽略当前属性。
  目前,有四个操作会忽略enumerable为false的属性。
  for...in循环:只遍历对象自身的和继承的可枚举的属性。
  Object.keys():返回对象自身的所有可枚举的属性的键名。
  JSON.stringify():只串行化对象自身的可枚举的属性。
  Object.assign(): 忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性。

 

  我们通过Object.defineProperty将对象的某一属性设为不可枚举,则用for..in、Object.keys等方法不会遍历到该属性
  eg:
    var obj = {};
    Object.defineProperty(obj,"name",{
      configurable: false,
      writable: true,
      enumerable: false,
      value: '张三'
    });
    Object.keys(obj); //[]

 

下面,我们分别介绍下对象属性的描述对象的4个属性:
  configurable:表示能否通过delete删除此属性,能否修改属性的特性,或能否修改把属性修改为访问器属性,如果直接使用字面量定义对象,默认值为true

  enumerable: 表示该属性是否可枚举,即是否通过for-in循环或Object.keys()返回属性,如果直接使用字面量定义对象,默认值为true

  writable: 能否修改属性的值,如果直接使用字面量定义对象,默认值为true
  value: 该属性对应的值,默认为undefined

 

扩展
可以用Object.defineProperty添加存取方法(set和get、vue是实现双向绑定的原理就是通过defineProperty去修改get和set方法)
eg:
  var obj3 = {},
  var a = 1;
  Object.defineProperty(obj3,"name",{
    configurable:true,
    enumerable:true,
    get:function(){
      return a;
    },
    set:function(newValue){
      a = newValue+1;
    }
  });
  obj3.name =>1
  obj3.name = 2;
  obj3.name =>3


注意:
1.get和set可以不同时使用,但在严格模式下只其中一个,会抛出错误

 

posted @ 2018-10-09 16:56  鳯訡  阅读(421)  评论(0编辑  收藏  举报