JS的可枚举性

    在学习ES6的过程当中,涉及到遍历方法时,提到过可枚举性,且多种遍历方法都与可枚举性相关。本章节,将总结这些遍历方法的可枚举性,并在必要的部分,给出对比实例。

1、设置属性的可枚举性

  在上一文章“ Object的原型克隆”中,简单介绍了Object.defineProperty()方法。经过该方法的属性描述符 enumerable,就能够设置该属性是否能够枚举,当设置为false时,不可枚举;不然,可枚举。如示例:
            Object.defineProperty(obj1, 'test', {
                configurable: false,
                enumerable: false,
                value: 'not enumerable'
            });
  将obj1的test属性,设置成不可枚举类型。其中的obj1为原型继承实例对象,相关源码可查看上一章 “ Object的原型克隆”。
  其属性结构以下图:
      
        以上为chrome下控制台obj1的输出截图,能够看到属性test显示为带灰度的色值,为不可枚举属性。
 

2、如何验证可枚举性

       可经过 Object.getOwnPropertyDescriptor() 实现验证,如实例:
        Object.getOwnPropertyDescriptor(obj1, 'test').enumerable,为false则为不可枚举。
   tips:仅验证自身属性的可枚举性,继承属性没法验证哦~~
 

3、与可枚举性相关的操做和方法

  3.一、总览

    a、for…in:遍历自身和继承的可枚举属性;
    b、Object.keys():返回对象自身的可枚举属性键名;
    c、JSON.stringify():串行化对象自身的可枚举属性;
    d、Object.assign():复制自身可枚举的属性;
    e、Reflect.enumerate():返回全部for...in循环会遍历的属性;
    f、全部Class的原型的方法都不可枚举。
    经过第一节中obj1的属性结构截图可分析其属性的组成:
      自身属性:age、colors、name、test(不可枚举);
      原型(继承)属性:sayAge、sayName。
  

  3.二、实验数据验证

    a、for…in
           
    符合预期,除test属性不可枚举外,其余属性均可遍历到;
 
    b、Object.keys()
          
    符合预期,仅遍历到自身可枚举属性;
    
    c、JSON.stringify()
          
    符合预期,仅解析自身可枚举属性;
    
    d、Object.assign()
     
    符合预期,仅复制自身可枚举属性;
 
    e、Reflect.enumerate() 在chrome中还未实现,暂没法验证。
    
    f、验证Class的原型方法都不可枚举
            class Points {
                constructor(name, age) {
                    this.name = name;
                    this.age = age;
                }
            }
 
            Object.assign(Points.prototype, SubType.prototype);
            let point = new Points('puppy', 1);
      point实例的属性结构以下:
              
      经过chrome的控制台,能够看出继承的原型属性中,sayAge与sayName均为可枚举属性,看似与预期不符合?
        
      下面对Class进行扩展,进一步验证:
           class Points {
                constructor(name, age) {
                    this.name = name;
                    this.age = age;
                }
 
                sayName() {
                    console.log(this.name)
                }
                sayColor() {
                    console.log(this.color)
                }
            }
    chrome控制台输出:
     
    其中的sayColor和sayName均不可枚举,符合预期。所以得出结论:
    经过Class定义的原型方法,不可枚举,且若是这些方法覆盖了原有的方法,这些方法也将不可枚举。
     tips:直接写入Class里的属性,为原型属性,全部实例共有;写在constructor内的为实例对象自身属性~~
相关文章
相关标签/搜索