zoukankan      html  css  js  c++  java
  • ES6 对象的扩展(下)

    属性的可枚举性

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

    var obj = { foo: 123 };
     Object.getOwnPropertyDescriptor(obj, 'foo')
    // {value: 123, writable: true, enumerable: true, configurable: true}
    
    var o = Object.defineProperty({}, 'display', {
        enumerable: false,
        value: 'block'
      })
    Object.getOwnPropertyDescriptor(o,'display')
    // {value: "block", writable: false, enumerable: false, configurable: false}
    

    ES5有三个操作,如果enumerable为false则对其不起作用:

      • for...in循环:只遍历对象自身的和继承的可枚举的属性。
    1. Object.keys():返回对象自身的所有可枚举的属性的键名。
    2. JSON.stringify():只串行化对象自身的可枚举的属性。

    ES6新增了两个操作,会忽略enumerable为false的属性。

    1. Object.assign():只拷贝对象自身的可枚举的属性。
    2. Reflect.enumerate():返回所有for...in循环会遍历的属性。

    这五个操作之中,只有for...in和Reflect.enumerate()会返回继承的属性。

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

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

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

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

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

  • 相关阅读:
    Windows XP下安装和配置Apache2.2.22服务器+PHP5+Mysql5
    win7下80端口被(Pid=4)占用的解决方法
    netty入门实例
    java NIO经典实例
    Eclipse下快速打开本地文件插件EasyExplorer(转)
    Nexus配置
    Maven依赖(转)
    【原创】C#玩高频数字彩快3的一点体会
    【原创】.NET读写Excel工具Spire.Xls使用(2)Excel文件的控制
    【踩坑经历】一次Asp.NET小网站部署踩坑和解决经历
  • 原文地址:https://www.cnblogs.com/huyuzhu/p/6523900.html
Copyright © 2011-2022 走看看