对象的扩展

对象的简介表示法

ES6 允许直接写入变量和函数作为函数的属性和方法,属性名为变量名,属性值为变量的值

const foo = 'bar';
const baz = {foo}
//等同于
const baz = {foo: foo}

如果某个方法的值是一个Generator函数,前面需要加*

const obj = {
  * m () {
    yield 'hello';
  }
}

属性名表达式

ES6 允许字面量定义对象时,把表达式放在方括号内作为属性名

const foo = 'bar';
const baz = {
  abc: 'hello',
  [foo]: 'world'
}

方法的 name 属性

返回函数名

function a (){}

a.name // "a"

Object.is(a, b)

比较两个值是否相等

===的区别

+0 === -0 // true
NaN === NaN // false

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

Object.assign()

用于对象的合并

  • 对对象只实行浅拷贝
  • 同名属性进行替换
  • 数组会当作对象进行处理
  • 只能进行值的复制,如果要复制的是一个取值函数,那么将求值后再复制
Object.assign({a: 1}, {b: 2}) // {a: 1, b: 2}

应用

  • 为对象添加属性
  • 为对象添加方法
  • 克隆对象
  • 合并多个对象
  • 为属性指定默认值

属性的可枚举性和遍历

可枚举性

对象的每个属性有一个描述对象Descriptor,来控制属性的行为,可以通过Object.getOwnPropertyDescriptor()来获取某对象的某属性的描述对象

通常有四个值和两个方法

  • value:值
  • writable:可写
  • enumerable:可枚举
  • configuragle:可配置
  • get:取值函数
  • set:存值函数

如果一个属性的enumberablefalse,那么这个属性是不可枚举的,下面四个方法会忽略

  • for...in
  • Object.keys()
  • JSON.stringify()
  • Object.assign()

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

属性的遍历

ES6 共有 5 种方法可以遍历对象的属性

  • for...in:遍历对象自身的和继承的可枚举属性(不包括Symbol属性
  • Object.keys(): 返回一个数组,包含对象自身(不含继承)所有可枚举属性(不包含Symbol属性)的键名
  • Objet.getOwnPropertyNames(obj):返回一个数组,包含对象自身的所有属性,(不含Symbol属性但是包括不可枚举属性)的键名
  • Object.getOwnPropertySymbols():返回一个数组,包含对象自身的所有Symbole属性的键名
  • Reflect.ownKeys(obj):返回一个数组,包含对象自身的所有键名,包括Symbol属性和不可枚举属性

遍历遵循以下规则

  • 首先遍历所有的数值键,按照数值升序排序
  • 其次遍历所有的字符串键,按照加入时间升序排序
  • 最后遍历所有的Symbol键,按照加入时间排序

Object.getOwnPropertyDescpriptors()

ES2017 引入该方法返回指定对象所有自身属性(非继承)的描述对象

__proto__属性,Object.setPrototypeOf(),Object.getPrototypeOf

__proto__属性

指向原型对象的prototype属性,ES6 建议只在浏览器部署该属性,而且建议不直接使用该属性

Object.setPrototypeOf()

作用与__proto__相同,可以用来设置一个对象的原型,为 ES6 推荐设置对象原型的方法

Object.getPrototypeOf()

读取一个对象的原型对象

super 关键字

  • ES6 规定super指向当前对象的原型对象
  • super只能用在对象的方法当中,用在其他地方都会报错,目前只有对象方法的简写方法才能够让 JavaScript 引擎确认定义的是对象的方法
  • super.foo()相当于 Object.getPrototypeOf(this).foo
上次更新: 10/7/2018, 10:23:42 PM