美文网首页让前端飞技术干货
深入理解ES6 --- 对象

深入理解ES6 --- 对象

作者: 漓漾li | 来源:发表于2019-03-29 18:14 被阅读14次

对象字面量语法扩展

(1) 属性初始值简写

对象字面量属性赋值为同名的局部变量时,不必再写: 和值,只写属性名即可。这种写法不仅简洁,而且也有助于消除命名错误,

let name = '漓漾li'
let age = 18
// es5
let es5Info = {
    name: name,
    age: age,
}
// es6
let es6Info = {
    name,
    age,
}
(2) 对象方法简写

为对象字面量添加方法时,不用再写:function。两个函数唯一的区别就是简写函数可以使用super.

// es5
let es5Person = {
    sayName: function(){
        console.log('漓漾li')
    },
}
// es6
let es6Person = {
    sayName () {
        console.log('漓漾li')
    },
}
(3) 可计算属性名

es5中,如果一个对象的属性名称来源于变量或者计算结果,在初始化这个变量时,就必须使用[]代替.;es6中则可以直接在字面量中使用[]

let keyName = 'name'
// es5
let es5Info = {}
es5[keyName] = '漓漾li'

// es6
let es6Info = {
    [keyName]: '漓漾li'
}

字面量中使用[],表示属性名称是可计算的,所以中括号内可以使用表达式

新增方法

(1) Object.is()

引入Object.is()主要是为了弥补全等运算符===的一些不准确运算,其余的远算结果基本一致。

NaN === NaN  // false  应该是相等的
+0 === -0  // true   应该是不相等的

Object.is(NaN, NaN)   // true
Object.is(+0, -0)  // false
(2) Object.assign

概念不在赘述。

Object.assign不能将提供者的访问器属性复制到接受对象中

let obj = {
  get name(){
    return 'val'
  }
}
let a = Object.assign({}, obj)

Object.getOwnPropertyDescriptor(obj,'name').get   //  [Function: get name]
Object.getOwnPropertyDescriptor(a,'name').get   //   undefined
(3) Object.setPrototypeOf

Object.setPrototypeOf可以修改指定对象的原型

对象原型的存储在内部专用属性[Prototype]中,调用Object.getPrototypeOf可以返回其中的值,调用Object.setPrototypeOf可以改变其中的值

(4) super

super,指向当前对象的原型对象。
假设实例与原型中有同名的方法,想要调用原型中的同名方法,在es5中:

let person = {
  name: 'person',
  sayName(){
    return this.name
  }
}
let xiaoli = {
  name:'xiaoli',
  sayName(){
    // 调用原型中的同名方法,并自定义
    // 如果不自定义函数,那也就不需要在实例中重新定义这个函数
    return Object.getPrototypeOf(this).sayName.call(this) + ' hi'
  }
}
Object.setPrototypeOf(xiaoli, person)
console.log(xiaoli.sayName())   // xiaoli hi
  1. Object.getPrototypeOf(this)用来获取xiaoli的原型(即person);
  2. sayName.call(this)是为了让sayNamexiaoli的上下文中执行,如果不绑定this,则会输出person hi

而是用es6中的super,就可以实现上述两点:调用原型的同名方法;并绑定this到当前作用域

let person = {
  name: 'person',
  sayName(){
    return this.name
  }
}
let xiaoli = {
  name:'xiaoli',
  sayName(){
    return super.sayName() + ' hi'
  }
}
Object.setPrototypeOf(xiaoli, person)
console.log(xiaoli.sayName())  // xiaoli hi

super必须在简写方法的对象中使用,否则会语法错误

对象属性的遍历

  • 对象的每一个属性都会有一个描述对象,来控制这个属性的行为。Object.getOwnPropertyDescriptor可以获取到对象属性的描述对象。
  • 描述对象中的enumerable属性,称为可枚举性如果enumerablefalse,则某些对象属性遍历的操作,就会忽略该属性
  • enumerable属性引入的目的就是让一些内部属性和方法避免被遍历到。比如对象原型的toString方法,和数组的length属性
方法\是否能遍历特殊属性 不可枚举属性 继承的可枚举属性 Symbol属性 备注
for...in 大多情况只关心对象自身的属性,谨慎使用
Object.keys(obj)
Object.getOwnPropertyNames(obj)
Object.getOwnPropertySymbols(obj) 只返回symbol属性
Reflect.ownKeys(obj)

遍历顺序规则:

  1. 首先遍历所有数值键,按照数值升序排列;
  2. 其次遍历所有字符串键,按照加入时间升序排列;
  3. 最后遍历所有 Symbol 键,按照加入时间升序排列。

相关文章

  • 对象解构

    《深入理解ES6》阅读随笔 在 ES6 中,对于解构对象做了一系列改进,使其用起来更加方面。 提取对象字面量:在 ...

  • 一些常用的代理陷阱函数(六)

    《深入理解ES6》阅读随笔 数组代理 在 ES6 之前,在 JavaScript 中是无法直接创建数组对象的,但是...

  • ES6 扩展的对象功能性

    本文来自深入理解ES6 对象类别 普通对象: 具有js对象所有默认内部行为特异对象: 具有某些与默认行为不符的内部...

  • 一些常用的代理陷阱函数(三)

    《深入理解ES6》阅读随笔 属性描述符陷阱 在 JavaScript 中,对象有 defineProperty 和...

  • 四: ES6 对象扩展

    前言 该部分为书籍 深入理解ES6 第四章(扩展的对象功能)笔记 对象类别 对象类别包括: 普通对象: 拥有 JS...

  • 强化原型(二)

    《深入理解ES6》阅读随笔 Super 的应用 在实例化对象以后,如果还想修改对象的方法,可以这么操作: 这里使用...

  • 深入理解ES6 --- 对象

    对象字面量语法扩展 (1) 属性初始值简写 为对象字面量属性赋值为同名的局部变量时,不必再写: 和值,只写属性名即...

  • 对象扩展后的一些变化

    《深入理解ES6》阅读随笔 在 JavaScript 中,有一切皆为对象之说,可见其重要性。关于对象的扩展,这里简...

  • ES5和ES6中的this问题及注意事项(附带少许作用域链查找知

    本文参考以下文章: 1、深入理解ES6箭头函数的this以及各类this面试题总结 2、深入理解ES6箭头函数中的...

  • ES6 中的内建迭代器

    《深入理解ES6》阅读随笔 对象集合迭代器 entries:遍历返回键与值; keys:遍历返回键(如果是数组返回...

网友评论

    本文标题:深入理解ES6 --- 对象

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