我的回答

  1. Object.create(), 根据参数创建对象
  2. Reflect, 将Object的后续方法都放到Reflect, 可以进行错误监听, 比企鹅都是函数式处理, 与Proxy对应
  3. class类进行继承
  4. Object.values, keys, entires

参考回答

对象变量式声明

ES6可以直接以变量形式声明对象属性或者方法,比传统的键值对形式声明更加简洁,更加方便,语义更加清晰

  1. let [name, age] = ["zf", 12];
  2. let info = { name, age };
  3. // info {name:"zf",age:12}
  4. //采用简洁方法
  5. /* ES5方式 */
  6. let obj = {
  7. fn:function(){}
  8. }
  9. /* ES6方式 */
  10. let obj = {
  11. fn(){}
  12. }

对象的解构赋值

ES6对象也可以像数组解构赋值那样进行变量的解构赋值

  1. let { name, age } = { name: "zf", age: 12 };
  2. console.log(name, age); //zf 12

对象扩展运算符

ES6对象的扩展运算符和数组扩展运算符用法本质上差别不大,毕竟数组是特殊对象。对象的扩展运算符一个最常用也最好用的用处就在于可以简单获取到一个目标对象内部全部和部分的可遍历的属性从而进行对象的合并和分解。

  1. let { name, ...info } = { name: "zf", age: 12 , address: "beijng" };
  2. console.log(name); //zf
  3. console.log(info); // {age: 12 , address: "beijng"}
  4. //扩展运算符只能用在最后一个参数

ES6在Object原型上新增了 is() 方法

用来做两个目标对象的相等比较,用来完善 === 方法。=== 方法中 NaN === NaN 为false,其实是不合理的,Object修复这个小bug,即NaN === NaN 为true

ES6在Object原型上新增了assign()方法

用于对象新增的属性或者多个对象合并

  1. const target = { name: "zf" };
  2. const obj1 = { age: 12 };
  3. const obj2 = { address: "beijing" };
  4. Object.assign(target, obj1 , obj2 );
  5. console.log(target); //{name: "zf", age: 12 , address: "beijing"}

需要注意的是: assgin 合并的对象只能合并obj1,obj2自身的属性,并不会合并obj1,obj2中的继承属性,也不会合并不可枚举的属性,并且无法正确拷贝get和set属性

ES6在Object原型上新增了 getOwnPropertyDescriptors() 方法

这个方法可以获取指定对象自身属性的描述对象。结合 defineProperties() 方法,可以完美复制对象包括get和set

ES6在Object原型上新增了 getPrototypeOf() 和 setPrototypeOf() 方法

用来获取或设置当前对象的 prototype 对象。这个方法存在的意义是: ES5中获取设置prototype对象是通过proto属性来实现的,但是proto属性并不是ES规范中明文规定的属性,只是浏览器各大厂商自己加上去的属性,只不过因为适用范围广泛而被采用,在非浏览器环境下并不一定好用,所以为了安全起见,获取或设置当前对象的prototype对象时,都应该采用ES6新增的标准用法

ES6在Object原型上新增了 Object.keys() , Object.values()和Object.entries()方法

用来获取对象的所有键、值、键值对的数组