阮一峰ES6教程讀書筆記(五)對象的擴展

1. 屬性的簡潔表示法

ES6 允許在大括號里面霸株,直接寫入變量和函數(shù),作為對象的屬性和方法集乔。這樣的書寫更加簡潔去件。

const foo = 'bar';
const baz = {foo};
baz // {foo: "bar"}

// 等同于
const baz = {foo: foo};

當然,除了屬性可以簡寫扰路,方法也可以簡寫尤溜,比如:

const obj = {
    print (param) {
        console.log(param)
    }
}

2. 屬性名表達式

我們知道,讀取對象的屬性時可通過obj.key或者obj[key]這兩種方式汗唱,不同的是第一種方式key必須是一個確定的鍵名宫莱,而第二種方法的key可以是確定的鍵名也能使一個表達式

let [key, age] = ['name', 23]

let obj = {
    [key]: 'bing',
    age: age
}
obj // {name: "bing", age: 23}

let obj = {
    [key]: 'bing',
    [age]: age
}
obj // {name: "bing", 23: 23}

通過上面的代碼可以看出來,如果給給對象的鍵名加上[]渡嚣,對象的鍵名就會變成一個JavaScript表達式梢睛,表達式計算出來的值就是對象的鍵名,如果上述例子不能很好理解识椰,看下面這個例子:

let lastWord = 'last word';

const a = {
  'first word': 'hello',
  [lastWord]: 'world'
};

a['first word'] // "hello"
a[lastWord] // "world"
a['last word'] // "world"

a[lastWord]a['last word']的值是一樣的绝葡,因為lastWord變量的值就是last word,所以這兩個值其實是一個對象的同一個鍵名對應(yīng)的值腹鹉。
需要注意的是如果表達式是一個對象藏畅,默認情況下會自動將對象轉(zhuǎn)為字符串[object Object]

const keyA = {a: 1};
const keyB = {b: 2};

const myObject = {
  [keyA]: 'valueA',
  [keyB]: 'valueB'
};

myObject // Object {[object Object]: "valueB"}

3. 方法的 name 屬性

對象的方法也是函數(shù),因此也有name屬性

const obj = {
    print () {
        console.log('hello world')
    }
}

obj.print.name // print

如果對象的方法使用了取值函數(shù)(getter)和存值函數(shù)(setter)功咒,則name屬性不是在該方法上面愉阎,而是該方法的屬性的描述對象的getset屬性上面,返回值是方法名前加上getset力奋。

const obj = {
  get foo() {},
  set foo(x) {}
};

obj.foo.name
// TypeError: Cannot read property 'name' of undefined

const descriptor = Object.getOwnPropertyDescriptor(obj, 'foo');

descriptor.get.name // "get foo"
descriptor.set.name // "set foo"

有兩種特殊情況:bind方法創(chuàng)造的函數(shù)榜旦,name屬性返回bound加上原函數(shù)的名字;Function構(gòu)造函數(shù)創(chuàng)造的函數(shù)景殷,name屬性返回anonymous溅呢。

(new Function()).name // "anonymous"

var doSomething = function() {
  // ...
};
f = doSomething.bind(this)
f.name // "bound doSomething"

4. 屬性的可枚舉性

對象的每個屬性都有一個描述對象澡屡,用來控制該屬性的行為。Object.getOwnPropertyDescriptor方法可以獲取該對象的屬性描述對象咐旧,描述對象的enumerable豎向稱為可枚舉性驶鹉,如果該屬性值為false,那么就說明該屬性不可枚舉铣墨,即某些操作或忽略該屬性室埋,目前有四個操作會忽略不可枚舉的屬性。

  • for...in循環(huán):只遍歷對象自身的和繼承的可枚舉的屬性伊约。
  • Object.keys():返回對象自身的所有可枚舉的屬性的鍵名姚淆。
  • JSON.stringify():只串行化對象自身的可枚舉的屬性。
  • Object.assign(): 忽略enumerablefalse的屬性碱妆,只拷貝對象自身的可枚舉的屬性肉盹。

引入可枚舉屬性的目的就在于讓某些屬性可以規(guī)避某些遍歷操作。
由此引發(fā)思考疹尾,當拷貝對象時上忍,我們?nèi)绻麅H僅使用for...in遍歷了對象的可枚舉屬性,那么不可枚舉屬性就會被遺漏纳本,那么對象拷貝就變得不嚴謹窍蓝,所以我使用Object.getOwnPropertyNames方法來替代```for...in``直接遍歷對象:

function deepCopy(obj) {
  if (obj instanceof Date) { return new Date(obj) }
  if (obj instanceof RegExp) { return new RegExp(obj)}  
  let result = new obj.__proto__.constructor()  
  for (let key of Object.getOwnPropertyNames(obg) {
    if (obj.hasOwnProperty(key) && obj[key] !== obj) { 
      if (typeof obj[key] === 'object' && obj[key] !== null) {
        result[key] = deepCopy(obj[key]);
      } else {
        result[key] = obj[key];
      }
    }
  }
  return result;
}

5. super 關(guān)鍵字

ES6 新增了關(guān)鍵字super,指向當前對象的原型對象繁成。

const proto = {
  foo: 'hello'
};

const obj = {
  foo: 'world',
  find() {
    return super.foo;
  }
};

Object.setPrototypeOf(obj, proto);
obj.find() // "hello"

值得注意的是super關(guān)鍵字只能用在對象的方法中吓笙,用在其他任何地方都會報錯。

// 報錯
const obj = {
  foo: super.foo
}

// 報錯
const obj = {
  foo: () => super.foo
}

// 報錯
const obj = {
  foo: function () {
    return super.foo
  }
}

上面三種super的用法都會報錯巾腕,因為對于 JavaScript 引擎來說面睛,這里的super都沒有用在對象的方法之中。第一種寫法是super用在屬性里面尊搬,第二種和第三種寫法是super用在一個函數(shù)里面叁鉴,然后賦值給foo屬性。目前佛寿,只有對象方法的簡寫法可以讓 JavaScript 引擎確認幌墓,定義的是對象的方法。

6. 對象的擴展運算符

之前在數(shù)組的擴展中介紹了擴展運算符(...)冀泻,ES2018將這個運算符引入了對象常侣,因為數(shù)組是一種特殊的對象,所以理論上弹渔,擴展運算符本就應(yīng)該應(yīng)用于對象中胳施。

6.1 使用擴展運算符解構(gòu)賦值

let obj = {
    name: 'bing',
    age: 23,
    id: 007
}

let {name, ...rest} = obj
name // 'bing'
rest // {age: 23, id: 7}

6.2 使用擴展運算符淺拷貝對象

對象的擴展運算符用于取出參數(shù)對象的所有可遍歷屬性,拷貝到當前對象之中肢专。

let foo = { ...['a', 'b', 'c'] };
foo
// {0: "a", 1: "b", 2: "c"}

如果擴展運算符后面是字符串巾乳,它會自動轉(zhuǎn)成一個類似數(shù)組的對象您没,因此返回的不是空對象。

{...'hello'}
// {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"}

跟數(shù)組一樣胆绊,擴展運算符還可以合并兩個對象

let ab = { ...a, ...b };
// 等同于
let ab = Object.assign({}, a, b);

如果對象中有重復(fù)的鍵值,那么后面的會覆蓋前面的欧募,相當于重復(fù)賦值压状。

let obj1 = {name:'bing'}
let obj2 = {name: 'yan'}
let obj = {...obj1, ...obj2}

obj // {name: "yan"}


參考鏈接

作者:阮一峰
鏈接:http://es6.ruanyifeng.com/#docs/destructuring

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市跟继,隨后出現(xiàn)的幾起案子种冬,更是在濱河造成了極大的恐慌,老刑警劉巖舔糖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娱两,死亡現(xiàn)場離奇詭異,居然都是意外死亡金吗,警方通過查閱死者的電腦和手機十兢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摇庙,“玉大人旱物,你說我怎么就攤上這事∥捞唬” “怎么了宵呛?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夕凝。 經(jīng)常有香客問我宝穗,道長,這世上最難降的妖魔是什么码秉? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任逮矛,我火速辦了婚禮,結(jié)果婚禮上泡徙,老公的妹妹穿的比我還像新娘橱鹏。我一直安慰自己,他們只是感情好堪藐,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布莉兰。 她就那樣靜靜地躺著,像睡著了一般礁竞。 火紅的嫁衣襯著肌膚如雪糖荒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天模捂,我揣著相機與錄音捶朵,去河邊找鬼蜘矢。 笑死,一個胖子當著我的面吹牛综看,可吹牛的內(nèi)容都是我干的品腹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼红碑,長吁一口氣:“原來是場噩夢啊……” “哼舞吭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起析珊,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤羡鸥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后忠寻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惧浴,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年奕剃,在試婚紗的時候發(fā)現(xiàn)自己被綠了衷旅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡祭饭,死狀恐怖芜茵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倡蝙,我是刑警寧澤九串,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站寺鸥,受9級特大地震影響猪钮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胆建,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一烤低、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笆载,春花似錦扑馁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涝登,卻和暖如春雄家,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胀滚。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工趟济, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乱投,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓顷编,卻偏偏與公主長得像戚炫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子媳纬,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 9.對象的擴展 1.屬性的簡潔表示法 es6允許直接寫入變量和函數(shù)嘹悼,作為對象的屬性和方法--為了簡潔 2.屬性名表...
    安樂_f487閱讀 526評論 0 0
  • 屬性的簡潔表示法 ES6允許直接寫入變量和函數(shù),作為對象的屬性和方法层宫。 上面代碼表明,ES6允許在對象之中其监,直接寫...
    oWSQo閱讀 509評論 0 0
  • 函數(shù)和對象 1萌腿、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句抖苦,而且...
    道無虛閱讀 4,564評論 0 5
  • 1. 屬性的間接表示法 ES6 允許直接寫入變量和函數(shù) 除屬性外 方法也可以簡寫 2. 屬性名表達式 ES6 允許...
    MrZhou_b216閱讀 221評論 0 0
  • 1.屬性的簡潔表示法 允許直接寫入變量和函數(shù) 上面代碼表明毁菱,ES6 允許在對象之中,直接寫變量锌历。這時贮庞,屬性名為變量...
    雨飛飛雨閱讀 1,135評論 0 3