• ES6学习--对象属性的可枚举性( enumerable)


    可枚举性(enumerable)用来控制所描述的属性,是否将被包括在for...in循环之中。具体来说,如果一个属性的enumerable为false,下面三个操作不会取到该属性。
    * for..in循环  :只遍历对象自身的和继承的可枚举的属性
    * Object.keys方法 :返回对象自身的所有可枚举的属性的键名
    * JSON.stringify方法:只串行化对象自身的可枚举的属性

    * Object.assign()(ES6):只拷贝对象自身的可枚举的属性

    这四个操作之中,只有for...in会返回继承的属性。至于for...in循环和Object.keys方法的区别,在于前者包括对象继承自原型对象的属性,而后者只包括对象本身的属性。如果需要获取对象自身的所有属性,不管enumerable的值,可以使用Object.getOwnPropertyNames方法

    例子:

    var o = {a:1, b:2};
    
    o.c = 3;
    Object.defineProperty(o, 'd', {
      value: 4,
      enumerable:false
    });
    
    o.d
    // 4
    
    for( var key in o ) console.log( o[key] );  // 遍历获取对象的属性值 
    // 1// 2
    // 3
    
    Object.keys(o)  // ["a", "b", "c"]  (获取对象的属性名)
    
    JSON.stringify(o) "{a:1,b:2,c:3}" (把对象转换成为字符串)

    上面代码中,d属性的enumerable为false,所以一般的遍历操作都无法获取该属性,使得它有点像“秘密”属性,但还是可以直接获取它的值。

    实际上,引入enumerable的最初目的,就是让某些属性可以规避掉for...in操作。比如,对象原型的toString方法,以及数组的length属性,就通过这种手段,不会被for...in遍历到。


    Object.getOwnPropertyDescriptor(Object.prototype, 'toString').enumerable
    // false
    
    Object.getOwnPropertyDescriptor([], 'length').enumerable
    // false

    上面代码中,toStringlength属性的enumerable都是false,因此for...in不会遍历到这两个继承自原型的属性。


    另外,ES6规定,所有Class的原型的方法都是不可枚举的。

    Object.getOwnPropertyDescriptor(class {foo() {}}.prototype, 'foo').enumerable
    // false

    总的来说,操作中引入继承的属性会让问题复杂化,大多数时候,我们只关心对象自身的属性。所以,尽量不要用for...in循环,而用Object.keys()代替。





  • 相关阅读:
    ECMAScript 6 字符串的扩展
    iOS蓝牙开发
    PhotoKit type类型
    HealthKit详解
    苹果证书签名机制
    小程序事件传递
    小程序跳转界面传可变参数
    小程序获取openId
    小程序发起post请求回调成功没有数据
    主干发布和分支发布
  • 原文地址:https://www.cnblogs.com/1571523732-qq/p/10071656.html
Copyright © 2020-2023  润新知