对象的扩展

2018-08-22  本文已影响0人  陶六六

对象的扩展

  1. 属性和方法简写
        var foo ='bar'
        var baz = {foo} <=> var baz={foo:foo}
        var o ={
            func(){}
        }
        <=> var o ={
            func:function(){}
        }
    
  2. 属性名表达式
        let foo ={
            ['b'+'z']:'baz',
            *['a'+'b'](){}
        }
    
  3. 可枚举性enumerable
    for..in,Object.keys(),JSON.stringify(),Object.assign()会忽略不可枚举的属性
  4. 属性的遍历
    • for...in 遍历自身和继承的可枚举属性,不含Symbol
    • Object.keys(obj) 返回自身的所有可枚举属性键名数组,不含Symbol,配套属性Object.values(obj),Object.entries(obj)规则相同
    • Object.getOwnPropertyNames(obj) 返回自身的所有属性键名数组,包含不可枚举,不包含Symbol
    • Object.getOwnPropertySymbols(obj) 返回自身的所有Symbol属性的键名数组
    • Reflect.ownKeys(obj) 返回自身的所有属性键名数组,包括不可枚举和Symbol
  5. 描述对象
    • Object.getOwnPropertyDescriptor(obj,key) 返回指定键名的描述对象
    • Object.getOwnPropertyDescriptors(obj) 返回对象所有自身属性的描述对象
  6. 原型对象操作
    • Object.setPrototypeOf(obj,prototype)
    • Object.getPrototypeOf(obj)
    • super 指向原型对象 只能用在对象方法上,即通过简写的对象方法,super调用的原型方法内部this指向当前对象而不是原型对象
        const foo = {
            goo:super.foo,//error
            foo:()=>super.foo,//error
            doo:function(){
                return super.foo
            },//error
            find(){
                return super.foo
            }//ok
        }
        // super.foo() === Object.getPropertyOf(this).foo.call(this)
    

tips

  1. 属性简写和属性名表达式不能同时使用
  2. Object.is()与===区别
    • +0===-0Object.is(+0,-0)=== false
    • NaN!==NaNObject.is(NaN,NaN)=== true
  3. Object属性遍历顺序
    1. 首先遍历数值键,按照数值升序排列
    2. 其次遍历所有字符串键,按照加入时间升序排列
    3. 最后遍历所有Symbol键,按照加入时间升序排列
上一篇下一篇

猜你喜欢

热点阅读