ES6之对象的扩展

作者: wade3po | 来源:发表于2019-05-15 10:59 被阅读3次

    JavaScript的世界,万物皆对象,ES6对对象有一些很大的升级。

    属性简介表示:

    允许直接写入变量和函数,属性名为变量名,属性值为变量值:

    var a = 1;var b = 2;
    
    console.log({a, b})//{a: 1, b: 2}
    

    方法简写应该就不用多说了:

    getData(){
    
    }
    

    使用exports的时候我们就经常用:

    var a = function(){}
    
    var b = function(){}
    
    module.exports = {  
    
      a: a,  
    
      b: b
    
    }
    

    等同于:

    module.exports = {a, b}
    

    属性名:

    对象使用字面量方式定义属性只有一种方法:

    var obj = {  
    
      a: 1
    
    }
    

    ES6支持表达式作为对象的属性名:

    var a = 'test';
    
    var obj = {  
    
      [a]: 1
    
    }
    
    console.log(obj);//{test: 1}
    

    函数name属性在函数扩展说过了,对象的函数现在也有name属性。

    属性可枚举和遍历:

    对象有一个描述对象,通过Object.getOwnPropertyDescriptor方法可以获取:

    var obj = {  
    
      a: 1
    
    }
    
    console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
    
    //{value: 1, writable: true, enumerable: true, configurable: true}
    

    enumberable是可枚举属性,如果是false,某些操作就会忽略当前的属性:

    var obj = {  
    
      a: 1,  
    
      b: 2
    
    }
    
    Object.defineProperty(obj, 'a', {  
    
      enumerable: false
    
    })
    
    for(let val in obj){   
    
     console.log(val);//b
    
    }
    

    目前有四个方法会把不可枚举的忽略:

    for...in循环、Object.keys()、JSON.stringify()、Object.assign()这四个方法都会不遍历不可枚举的属性。前三个是ES5的,最后一个是ES6的。

    可枚举属性就是为了让某些属性可以不被枚举,比如length、toString等,我们是希望不被循环出来的。ES6的Class原型的方法都是不可枚举的。

    遍历对象属性键名有五种方法:

    For in不含symbol

    Object.keys()返回数组,不包含symbol

    Object.getOwnPropertyNames()返回数组,不可枚举的也包括,不包括symbol

    Object.getOwnPropertySymbols()返回数组,所有symbol的键名。

    Reflect.ownKeys()返回数组,包括所有的键名,不管可枚举不可枚举。

    super关键字,这边说一下,JavaScript引擎现在只能识别对象方法的简写定义的是对象方法:

    var obj = {  
    
      test() {  
    
      }
    
    }
    

    super关键字只能用在对象方法中,指向当前对象的原型对象,但只是当前对象,this的指向是不变的:

    var proto = {  
    
      a: 'a', 
    
       b: 'a'
    
    };
    
    var obj = {  
    
      a: 'b',  
    
      b: 'b', 
    
       test() {   
    
         console.log(this.b);//b   
    
         return super.a;  
    
      }
    
    };
    
    Object.setPrototypeOf(obj, proto);
    
    console.log(obj.test()); // "a"
    

    扩展运算符和结构赋值,之前有说过,这边就分享几个点:

    解构赋值是浅拷贝

    扩展运算符的解构不能复制原型的属性

    var o = Object.create({ x: 1, y: 2 });
    
    o.z = 3;
    
    let { x, ...newObj } = o;
    
    console.log(newObj);//{z: 3}
    

    ES6对对象新增了很多方法:

    Object.is()跟严格相等(===)一样,多加了两个不同,+0不等于-0和NAN等于NAN。

    console.log(+0 === -0); //true
    
    console.log(NaN === NaN); // false
    
    console.log(Object.is(+0, -0)); // false
    
    console.log(Object.is(NaN, NaN)); // true
    

    Object.assign,我觉得这个方法不用多介绍,就是合并对象到第一个参数。需要注意的是,参数放后面的,如果属性相同,会被后面的覆盖。

    Undefined和null当做首参数会报错,不是对象的会转成对象返回,非对象的参数不在第一个,不能转成对象就会跳过。布尔值和数字也会跳过。且只会拷贝可枚举的自身属性。

    assign方法是浅拷贝,函数是无法复制的。

    ES2017引入Object.getOwnPropertyDescriptors(),返回所有对象属性的描述:

    const obj = {  
    
      foo: 'world',  
    
      find() {    
    
        return super.foo;  
    
      }
    
    };
    
    console.log(Object.getOwnPropertyDescriptors(obj));
    
    find: 
    
     configurable: true 
    
     enumerable: true 
    
     value: ƒ find() 
    
     writable: truefoo: 
    
     configurable: true 
    
     enumerable: true 
    
    
    
     value: "world" 
    
     writable: true
    

    ES2015的Object.getOwnPropertyDescriptor()是获取某一个。

    Object.setPrototypeOf()(写操作)

    Object.getPrototypeOf()(读操作)

    Object.create()(生成操作)

    这三个方法都是对原型的操作,比如set就是改变原型的指向:

    var proto = {};
    
    var obj = { a: 1 };
    
    Object.setPrototypeOf(obj, proto);
    
    proto.b = 20;
    
    console.log(obj.b);//20
    

    Obj的原型指向了proto。

    ES5的Object.keys(),ES2017的Object.values(),Object.entries(),这三个方法都是返回数组,一个是键值,一个是属性值,一个是键值对。包含可枚举且不是symbol的自身属性。

    Object.fromEntries()是Object.entries()的逆操作,把键值对的数组变成对象:

    console.log(Object.fromEntries([    ['a', 'a'],    ['b', 'b']]));
    
    //{a: "a", b: "b"}
    
    

    相关文章

      网友评论

        本文标题:ES6之对象的扩展

        本文链接:https://www.haomeiwen.com/subject/tbouaqtx.html