對(duì)象字面量是指以{}形式直接表示的對(duì)象,比如下面這樣:
var book = {
title: 'Modular ES6',
author: 'Nicolas',
publisher: 'O′Reilly'
}
ES6 為對(duì)象字面量的語(yǔ)法帶來(lái)了一些改進(jìn):包括屬性/方法的簡(jiǎn)潔表示,可計(jì)算的屬性名等等,我們逐一來(lái)看:
屬性的簡(jiǎn)潔表示法
一個(gè)我們聲明的對(duì)象中包含若干屬性,其屬性值由變量表示,且變量名和屬性名一樣的。比如下面這樣,我們想把一個(gè)名為 listeners 的數(shù)組賦值給events對(duì)象中的listeners屬性,用ES5我們會(huì)這樣做:
var listeners = []
function listen() {}
var events = {
listeners: listeners,
listen: listen
}
ES6則允許我們簡(jiǎn)寫(xiě)成下面這種形式:
var listeners = []
function listen() {}
var events = { listeners, listen }
這是ES6帶來(lái)的好處之一,它提供了眾多更簡(jiǎn)潔,語(yǔ)義更清晰的語(yǔ)法,讓我們的代碼的可讀性,可維護(hù)性大大提升。
可計(jì)算的屬性名
對(duì)象字面量的另一個(gè)重要更新是允許你使用可計(jì)算的屬性名,在ES5中我們也可以給對(duì)象添加屬性名為變量的屬性,一般說(shuō)來(lái),我們要按下面方法這樣做,首先聲明一個(gè)名為expertise的變量,然后通過(guò)person[expertise]這種形式把變量添加為對(duì)象person的屬性:
var expertise = 'journalism'
var person = {
name: 'xu',
age: 25
}
person[expertise] = {
years: 5,
interests: ['international', 'politics', 'internet']
}
ES6 中,對(duì)象字面量可以使用計(jì)算屬性名了,把任何表達(dá)式放在中括號(hào)中,表達(dá)式的運(yùn)算結(jié)果將會(huì)是對(duì)應(yīng)的屬性名,上面的代碼,用ES6可以這樣寫(xiě):
var expertise = 'journalism'
var person = {
name: 'xu',
age: 25,
[expertise]: {
years: 5,
interests: ['international', 'politics', 'internet']
}
}
不過(guò)需要注意的是,簡(jiǎn)寫(xiě)屬性和計(jì)算的屬性名不可同時(shí)使用。這是因?yàn)椋?jiǎn)寫(xiě)屬性是一種在編譯階段的就會(huì)生效的語(yǔ)法糖,而計(jì)算的屬性名則在運(yùn)行時(shí)才生效。如果你把二者混用,代碼會(huì)報(bào)錯(cuò)。而且二者混用往往還會(huì)降低代碼的可讀性,所以JavaScript在語(yǔ)言層面上限制二者不能混用也是個(gè)好事。
var expertise = 'journalism'
var journalism = {
years: 5,
interests: ['international', 'politics', 'internet']
}
var person = {
name: 'xu',
age: 25,
[expertise] // 這里會(huì)報(bào)語(yǔ)法錯(cuò)誤
}
方法定義
傳統(tǒng)上如何定義對(duì)象方法,下述代碼中,我們構(gòu)建了一個(gè)事件發(fā)生器,其中的on方法用以注冊(cè)事件,emit方法用以執(zhí)行事件:
var emitter = {
events: {},
on: function (type, fn) {
if (this.events[type] === undefined) {
this.events[type] = []
}
this.events[type].push(fn)
},
emit: function (type, event) {
if (this.events[type] === undefined) {
return
}
this.events[type].forEach(function (fn) {
fn(event)
})
}
}
ES6 的對(duì)象字面量方法簡(jiǎn)寫(xiě)允許我們省略對(duì)象方法的function關(guān)鍵字及之后的冒號(hào),改寫(xiě)后的代碼如下:
var emitter = {
events: {},
on(type, fn) {
if (this.events[type] === undefined) {
this.events[type] = []
}
this.events[type].push(fn)
},
emit(type, event) {
if (this.events[type] === undefined) {
return
}
this.events[type].forEach(function (fn) {
fn(event)
})
}
}