《深入理解ES6》4.擴充套件的物件功能

張雪蓮發表於2019-02-14

屬性初始值的簡寫

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'
}複製程式碼

方括號中內容同樣可以使用表示式作為屬性的可計算名稱

var suffix = 'name'
var person = {
  ['first ' + suffix]: 'Li',
  ['last ' + suffix]: 'yun hua'
}複製程式碼

也就是說任何可用於物件例項括號記法的屬性名同樣可以作為物件字面量中計算屬性名

Object.is

對Object.is方法來說,其運算結果大部分情況與===運算子相同,唯一區別在於+0和-0被識別為不相等,NaN和NaN被識別為相等

Object.assign

Object.assign方法接受任意數量的源物件,並按指定的順序將屬性複製到接收物件中,所以如果多個源物件具有同名屬性,則排位靠後的源物件會覆蓋排位靠前的
有一個需要特別注意的點是Object.assign方法不能將提供者的訪問器屬性複製到接收物件中,由於Object.assign執行了賦值操作,因此提供者的訪問器屬性最終會被轉變為接收物件中的一個資料屬性

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() 處理屬性的順序 

自有屬性列舉時基本順序如下:
複製程式碼

1. 所有的數字型別鍵,按升序排列。
2. 所有的字串型別鍵,按被新增到物件的順序排列。
3. 所有的符號型別(詳見第六章)鍵,也按新增順序排列。 

修改物件的原型 

Object.getPrototypeOf() 方法來從任意指定物件中獲取其原型 

Object.setPrototypeOf() 方法允許你修改任意指定物件的原型。它接受兩個引數:需要被修改原型的物件,以及將會成為前者原型的物件 

使用 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 繫結並呼叫該方法 


相關文章