《深刻理解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 綁定並調用該方法 

相關文章
相關標籤/搜索