點燈坊

失くすものさえない今が強くなるチャンスよ

ECMAScript 之 Property Accessor

Sam Xiao's Avatar 2019-09-02

ECMAScript 5 的 Property Accessor 提供了 Bracket Notation 可使用 [] 存取 Property,這使得 Property 可以使用 Variable;而 ECMAScript 2015 更加碼提供 Computed Property Name,讓我們在建立 Object 時就能使用 []

Version

macOS Mojave 10.14.6
VS Code 1.37.1
Quokka 1.0.240
ECMAScript 2015

Property Accessor

let book = {
  title: 'FP in JavaScript',
  price: 100,
  showDescdription: function() {
    return `${this.title} / ${this.price}`
  }
}

book.title // ?
book['title'] // ?

person 為 object,有 property 也有 method。

第 9 行

book.title // ?

為傳統 OOP 使用 dot notation . 純取 property。

10 行

book['title'] // ?

ECMAScript 允許我們以 bracket notation [] 存取 property 與執行 method。

這樣有什麼用呢 ?

既然 [] 可為 string,就表示可以是 variable,這就開了一個很大的門。

property000

Read Property by Variable

let book = {
  title: 'FP in JavaScript',
  price: 100,
  showDescdription: function() {
    return `${this.title} / ${this.price}`
  }
}

let fn = prop => obj => obj[prop]

fn('title')(book) // ?

Property 名稱可改用 function 的 argument 傳入,如此就能以 variable 的方式取得 property。

property001

Run Method by Variable

let book = {
  title: 'FP in JavaScript',
  price: 100,
  showDescdription: function() {
    return `${this.title} / ${this.price}`
  }
}

let fn = prop => obj => obj[prop]()

fn('showDescdription')(book) // ?

Method 名稱可改用 function 的 argument 傳入,如此就能以 variable 的方式執行 function。

property002

Computed Property Name

let create = k => v => ({[k]: v})

let obj = create('title')('FP in JavaScript')
obj.title // ?

ES5 的 [] 只能針對既有 object 去讀取 property,ES6 將這種特性繼續發揚光大,讓你在建立 object 時也能使用 []

property003

Conclusion

  • Property accessor 的 [] 是我很愛的 syntax,當 property 名稱能使用 variable 後,就能動態存取 property 與執行 method
  • Computed property name 則讓我們連建立 object 時也能使用 [],語法直覺可讀性又高

Reference

MDN, Property accessors
MDN, Object initializer