# 属性初始值简写

function createPerson(name, age) {
  return {
    name, // name: name
    age  // age: age
  }
}

# 方法简写

var person = {
  name: "abc",
  sayName(){
    console.log(this.name);
  },
  // sayName: function() {
  //  console.log(this.name);
  // }
}

# 可计算属性名

let lastName = "abc";
let person = {
  [lastName]: "Zakas"
}
console.log(person[lastName]);

# 新增方法

  1. Object.js(v1, v2)
// Object.is() 大部分情况与 === 运算一样
// 除了 +0 和 -0 被识别为不等, NaN 和 NaN 相等。

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

console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); // true
  1. Object.assign(receiver, supplier)
// 用来代替 Mixin,extend; 
// 他们的作用就是把supplier对象的属性浅复制给receiver对象
function Mixin(receiver, supplier) {
  Object.keys(supplier).forEach((key)=>{
    receiver[key] = supplier[key];   
  });
  return receiver;
}

// es6的写法
Object.assign(receiver, supplier);
// 注意
// 1. Object.assign 接收任意数量的 supplier, 
// 属性相同的话,后面的会覆盖前面的
// 2. 不能复制 getter, setter, 
// 有 getter, setter的话,会添加 getter, setter的返回值作为属性名。

# 重复的对象字面量属性

# 自由属性枚举顺序

Object.getOwnPropertyNames()

  1. 所有数字键按升序排列。
  2. 所有字符串键按照它们被加入对象的顺序排列。
  3. 所有Symbol键按照它们被加入对象的顺序排列。

# 改变对象原型

  1. Object.getPrototypeOf()
  2. Object.setPrototypeOf()

# 简化原型访问的Super引用

let person = {
  getCreeting(){
    return "Hello";
  }
}

let friend = {
  getGreeting(){
    // 1. super 只能在简写的方法中调用c
    // 2. getGreeting内部[[HomeObject]]属性为friend
    return super.getCreeting() + ", hi";
  }
}
Object.setPrototypeOf(friend, person);
console.log(friend.getGreeting()); // Hello, hi