《深刻理解ES6》4.扩展的对象功能

属性初始值的简写

function createPerson(name, age) {
    return {
        name,
        age
    };   
 } 复制代码

对象方法的简写

var person = {
  name: 'angela',
  sayName() {
    console.log(this.name)
  }
}复制代码

可计算属性名

let lastName = 'last name';
var person = {
  "first name": 'Li',
  [lastName]: 'yun hua'
}复制代码

方括号中内容一样可使用表达式做为属性的可计算名称
javascript

var suffix = 'name'
var person = {
  ['first ' + suffix]: 'Li',
  ['last ' + suffix]: 'yun hua'
}复制代码

也就是说任何可用于对象实例括号记法的属性名一样能够做为对象字面量中计算属性名
java

Object.is

对Object.is方法来讲,其运算结果大部分状况与===运算符相同,惟一区别在于+0和-0被识别为不相等,NaN和NaN被识别为相等
typescript

Object.assign

Object.assign方法接受任意数量的源对象,并按指定的顺序将属性复制到接收对象中,因此若是多个源对象具备同名属性,则排位靠后的源对象会覆盖排位靠前的
有一个须要特别注意的点是Object.assign方法不能将提供者的访问器属性复制到接收对象中,因为Object.assign执行了赋值操做,所以提供者的访问器属性最终会被转变为接收对象中的一个数据属性bash

var receiver = {},
  supplier = {
    get name() {
      return "file.js"
    }
  }
Object.assign(receiver, supplier)
var desc = Object.getOwnPropertyDescriptor(receiver, "name") // {value: "file.js", 
writable: true,enumerable: true,configurable: true}
console.log(desc.value)//file.js
console.log(desc.get)//undefined复制代码

重复的对象字面量属性 

"use strict";
var person = {
   name: "Nicholas",
   name: "Greg" // 在 ES5 严格模式中是语法错误
}; 复制代码

在 ES5 严格模式下运行时,第二个 name 属性会形成语法错误。但 ES6 移除了重复属性的 检查,严格模式与非严格模式都再也不检查重复的属性。当存在重复属性时,排在后面的属性 的值会成为该属性的实际值 函数

自有属性的枚举顺序 

而 ES6 则严格定 义了对象自有属性在被枚举时返回的顺序。Object.getOwnPropertyNames() 与Reflect.ownKeys (详见第十二章)如何返回属性形成了影响,还一样影响了 Object.assign() 处理属性的顺序 ui

自有属性枚举时基本顺序以下:
复制代码

1. 全部的数字类型键,按升序排列。
2. 全部的字符串类型键,按被添加到对象的顺序排列。
3. 全部的符号类型(详见第六章)键,也按添加顺序排列。 this

修改对象的原型 

Object.getPrototypeOf() 方法来从任意指定对象中获取其原型 spa

Object.setPrototypeOf() 方法容许你修改任意指定对象的原型。它接受两个参数:须要被修改原型的对象,以及将会成为前者原型的对象 scala

使用 super 引用的简单原型访问 

若要覆盖对象实例的一个方法、但依然要调用原型上的同名方法指针

let person = {
    getGreeting() {
        return "Hello";
    } 
}; 						
let friend = {    
    getGreeting() {
        return Object.getPrototypeOf(this).getGreeting.call(this) + ", hi!";
    }
};
// 将原型设置为 person
Object.setPrototypeOf(friend, person);
console.log(friend.getGreeting());  // "Hello, hi!"复制代码

super 是指向当前对象的原型的一个指针,实际上就是 Object.getPrototypeOf(this) 的值 

let friend = {
    getGreeting() {      return super.getGreeting() + ", hi!";    }
}; 复制代码

你能使用 super 引用来调用对象原型上的任何方法,只要这个引用是位于简写的方法以内 

方法是一个拥有 [[HomeObject]] 内部属性的函数,此内部属性指向该方法所属的对象 

任何对 super 的引用都会使用 [[HomeObject]] 属性来判断要作什么。

     1:是在 [[HomeObject]] 上调用 Object.getPrototypeOf() 来获取对原型的引用;

     2:在该原型上查找同名函数;

     3:建立 this 绑定并调用该方法 

相关文章
相关标签/搜索