摘要:主要知識(shí)點(diǎn)有對(duì)象類(lèi)別屬性速記法方法簡(jiǎn)寫(xiě)需計(jì)算屬性名方法方法可允許重復(fù)的屬性自有屬性的枚舉順序方法引用方法定義深入理解筆記目錄對(duì)象類(lèi)別普通對(duì)象擁有對(duì)象所有默認(rèn)的內(nèi)部行為。奇異對(duì)象其內(nèi)部行為在某些方面有別于默認(rèn)行為。所有的標(biāo)準(zhǔn)對(duì)象都是內(nèi)置對(duì)象。
主要知識(shí)點(diǎn)有對(duì)象類(lèi)別、屬性速記法、方法簡(jiǎn)寫(xiě)、需計(jì)算屬性名、Object.is()方法、Object.assign()方法、可允許重復(fù)的屬性、自有屬性的枚舉順序、Object.setPrototypeOf()方法、super引用、方法定義
《深入理解ES6》筆記 目錄
對(duì)象類(lèi)別普通對(duì)象:擁有 JS 對(duì)象所有默認(rèn)的內(nèi)部行為。
奇異對(duì)象:其內(nèi)部行為在某些方面有別于默認(rèn)行為。
標(biāo)準(zhǔn)對(duì)象:在 ES6 中被定義的對(duì)象,例如 Array 、 Date ,等等。標(biāo)準(zhǔn)對(duì)象可以是普通的,也可以是奇異的。
內(nèi)置對(duì)象:在腳本開(kāi)始運(yùn)行時(shí)由 JS 運(yùn)行環(huán)境提供的對(duì)象。所有的標(biāo)準(zhǔn)對(duì)象都是內(nèi)置對(duì)象。
對(duì)象字面量語(yǔ)法的擴(kuò)展 屬性初始化器的速記法屬性初始化器的速記法可以用來(lái)消除屬性名和本地變量的重復(fù)情況,可以使用作用域內(nèi)的變量值賦值給同名屬性:
ES5 及更早版本中:
function createPerson(name, age) { return { name: name, age: age }; }
ES6簡(jiǎn)寫(xiě):
function createPerson(name, age) { return { name, age }; }方法簡(jiǎn)寫(xiě)
在對(duì)象字面量的寫(xiě)法中,為一個(gè)對(duì)象添加一個(gè)方法,需要指定對(duì)象的屬性以及具體的函數(shù)聲明。ES6提供了一種方法簡(jiǎn)寫(xiě)語(yǔ)法,通過(guò)省略function關(guān)鍵字,能夠讓為對(duì)象添加方法的語(yǔ)法更加簡(jiǎn)潔。
ES5中的寫(xiě)法:
var person = { name: "Nicholas", sayName: function() { console.log(this.name); } };
ES6簡(jiǎn)寫(xiě)語(yǔ)法:
var person = { name: "Nicholas", sayName() { console.log(this.name); } };需計(jì)算屬性名
需計(jì)算屬性名規(guī)則允許對(duì)象字面量中屬性名是變量、字符串字面量或者由變量計(jì)算而得的,具體寫(xiě)法是通過(guò)方括號(hào)[]包含屬性名。
var lastName = "last name"; var person = { "first name": "Nicholas", [lastName]: "Zakas" }; console.log(person["first name"]); // "Nicholas" console.log(person[lastName]); // "Zakas" var suffix = " name"; var person = { ["first" + suffix]: "Nicholas", ["last" + suffix]: "Zakas" }; console.log(person["first name"]); // "Nicholas" console.log(person["last name"]); // "Zakas" const id = 5 const obj = { [`my-${id}`]: id } console.log(obj["my-5"]) // 5新的方法:Object.is()和Object.assign() Object.is() 方法
JS中比較兩個(gè)值是否相同的時(shí)候會(huì)使用嚴(yán)格等于運(yùn)算符===,但是,使用嚴(yán)格運(yùn)算符式,+0和-0會(huì)認(rèn)為這兩者是相等的,而NaN===NaN是不相等的,使用Object.is()方法來(lái)判斷這兩者情況與使用嚴(yán)格相等符會(huì)有所不同,其他情況和使用嚴(yán)格相等運(yùn)算符基本一致;
console.log(+0 == -0); // true console.log(+0 === -0); // true console.log(Object.is(+0, -0)); // false console.log(NaN == NaN); // false console.log(NaN === NaN); // false console.log(Object.is(NaN, NaN)); // true console.log(5 == 5); // true console.log(5 == "5"); // true console.log(5 === 5); // true console.log(5 === "5"); // false console.log(Object.is(5, 5)); // true console.log(Object.is(5, "5")); // falseObject.assign() 方法
混入( Mixin )是在 JS 中組合對(duì)象時(shí)最流行的模式。在一次混入中,一個(gè)對(duì)象會(huì)從另一個(gè)對(duì)象中接收屬性與方法。
下面是一個(gè)mixin方法的實(shí)現(xiàn),這個(gè)方法實(shí)現(xiàn)的是淺拷貝。將b對(duì)象的屬性拷貝到了a對(duì)象,合并成一個(gè)新的對(duì)象。
//mixin不只有這一種實(shí)現(xiàn)方法。 function mixin(receiver, supplier) { Object.keys(supplier).forEach((key) => { receiver[key] = supplier[key] }) return receiver } let a = {name: "sb"}; let b = { c: { d: 5 } } console.log(mixin(a, b)) // {"name":"sb","c":{"d":5}}
寫(xiě)這樣一個(gè)mixin方法是不是很煩,而且每個(gè)項(xiàng)目都得引入這個(gè)方法,現(xiàn)在,ES6給我們提供了一個(gè)現(xiàn)成的方法Object.assign()來(lái)做mixin的事情。
假設(shè)要實(shí)現(xiàn)上面的mixin方法,你只需要給Object.assign()傳入?yún)?shù)即可。
console.log(Object.assign(a, b))// {"name":"sb","c":{"d":5}}重復(fù)的對(duì)象字面量屬性
ES5 嚴(yán)格模式為重復(fù)的對(duì)象字面量屬性引入了一個(gè)檢查,若找到重復(fù)的屬性名,就會(huì)拋出錯(cuò)誤。
"use strict"; var person = { name: "Nicholas", name: "Greg" // 在 ES5 嚴(yán)格模式中是語(yǔ)法錯(cuò)誤 };
ES6 移除了重復(fù)屬性的檢查,嚴(yán)格模式與非嚴(yán)格模式都不再檢查重復(fù)的屬性。當(dāng)存在重復(fù)屬性時(shí),排在后面的屬性的值會(huì)成為該屬性的實(shí)際值:
"use strict"; var person = { name: "Nicholas", name: "Greg" // 在 ES6 嚴(yán)格模式中不會(huì)出錯(cuò) }; console.log(person.name); // "Greg"自有屬性的枚舉順序
ES5 并沒(méi)有定義對(duì)象屬性的枚舉順序,而是把該問(wèn)題留給了 JS 引擎廠(chǎng)商。而 ES6 則嚴(yán)格定義了對(duì)象自有屬性在被枚舉時(shí)返回的順序。這對(duì) Object.getOwnPropertyNames() 與Reflect.ownKeys)如何返回屬性造成了影響,還同樣影響了Object.assign() 處理屬性的順序。
自有屬性枚舉時(shí)基本順序如下:
所有的數(shù)字類(lèi)型鍵,按升序排列。
所有的字符串類(lèi)型鍵,按被添加到對(duì)象的順序排列。
所有的符號(hào)類(lèi)型(詳見(jiàn)第六章)鍵,也按添加順序排列。
const state = { id: 1, 5: 5, name: "eryue", 3: 3 } Object.getOwnPropertyNames(state) //["3","5","id","name"] 枚舉key Object.assign(state, null) //{"3":3,"5":5,"id":1,"name":"eryue"}
for-in 循環(huán)的枚舉順序仍未被明確規(guī)定,因?yàn)椴⒎撬械?JS 引擎都采用相同的方式。而 Object.keys() 和 JSON.stringify() 也使用了與 for-in 一樣的枚舉順序。更強(qiáng)大的原型
一般來(lái)說(shuō),對(duì)象的原型會(huì)在通過(guò)構(gòu)造器或 Object.create() 方法創(chuàng)建該對(duì)象時(shí)被指定。
ES5 添加了 Object.getPrototypeOf() 方法來(lái)從任意指定對(duì)象中獲取其原型;
缺少在初始化之后更改對(duì)象原型的標(biāo)準(zhǔn)方法。
ES6 通過(guò)添加 Object.setPrototypeOf() 方法而改變了這種假定,此方法允許你修改任意指定對(duì)象的原型。它接受兩個(gè)參數(shù):需要被修改原型的對(duì)象,以及將會(huì)成為前者原型的對(duì)象。
let person = { getGreeting() { return "Hello"; } }; let dog = { getGreeting() { return "Woof"; } }; // 原型為 person let friend = Object.create(person); console.log(friend.getGreeting()); // "Hello" console.log(Object.getPrototypeOf(friend) === person); // true // 將原型設(shè)置為 dog Object.setPrototypeOf(friend, dog); console.log(friend.getGreeting()); // "Woof" console.log(Object.getPrototypeOf(friend) === dog); // true使用 super 引用的簡(jiǎn)單原型訪(fǎng)問(wèn)
能夠使用super引用,來(lái)訪(fǎng)問(wèn)原型中的方法:
const proto = { foo: "hello" }; const obj = { foo: "world", find() { return super.foo; } }; Object.setPrototypeOf(obj, proto); obj.find() // "hello"
注意,super關(guān)鍵字表示原型對(duì)象時(shí),只能用在對(duì)象的簡(jiǎn)寫(xiě)方法之中,用在其他地方都會(huì)報(bào)錯(cuò)。
// 報(bào)錯(cuò) const obj = { foo: super.foo } // 報(bào)錯(cuò) const obj = { foo: () => super.foo } // 報(bào)錯(cuò) const obj = { foo: function () { return super.foo } }
javaScript 引擎內(nèi)部,super.foo等同于Object.getPrototypeOf(this).foo(屬性)或Object.getPrototypeOf(this).foo.call(this)(方法)。
const proto = { x: "hello", foo() { console.log(this.x); }, }; const obj = { x: "world", foo() { super.foo(); } } Object.setPrototypeOf(obj, proto); obj.foo() // "world"
上面代碼中,super.foo指向原型對(duì)象proto的foo方法,但是綁定的this卻還是當(dāng)前對(duì)象obj,因此輸出的就是world。
正式的“方法”定義ES6 則正式做出了定義:方法是一個(gè)擁有 [[HomeObject]] 內(nèi)部屬性的函數(shù),此內(nèi)部屬性指向該方法所屬的對(duì)象。
let person = { // 方法 getGreeting() { return "Hello"; } }; // 并非方法 function shareGreeting() { return "Hi!"; }
大多數(shù)情況下,這種差異并不重要,然而使用 super 引用時(shí)就完全不同了。
let person = { getGreeting() { return "Hello"; } }; // 原型為 person let friend = { getGreeting() { return super.getGreeting() + ", hi!"; } }; Object.setPrototypeOf(friend, person); console.log(friend.getGreeting()); // "Hello, hi!"
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108409.html
摘要:將對(duì)象的屬性拷貝到了對(duì)象,合并成一個(gè)新的對(duì)象。而這種行為也是新增的標(biāo)準(zhǔn)??偨Y(jié)本章講解了對(duì)象字面量語(yǔ)法拓展,新增方法,允許重復(fù)的對(duì)象字面量屬性,自有枚舉屬性排序,增強(qiáng)對(duì)象原型,明確了方法的定義。但是,就算把全部新增的功能記住也不是難事。 變量功能被加強(qiáng)了、函數(shù)功能被加強(qiáng)了,那么作為JavaScript中最普遍的對(duì)象,不加強(qiáng)對(duì)得起觀眾嗎? 對(duì)象類(lèi)別 在ES6中,對(duì)象分為下面幾種叫法。(不需...
摘要:最近買(mǎi)了深入理解的書(shū)籍來(lái)看,為什么學(xué)習(xí)這么久還要買(mǎi)這本書(shū)呢主要是看到核心團(tuán)隊(duì)成員及的創(chuàng)造者為本書(shū)做了序,作為一個(gè)粉絲,還是挺看好這本書(shū)能給我?guī)?lái)一個(gè)新的升華,而且本書(shū)的作者也非常厲害。 使用ES6開(kāi)發(fā)已經(jīng)有1年多了,以前看的是阮一峰老師的ES6教程,也看過(guò)MDN文檔的ES6語(yǔ)法介紹。 最近買(mǎi)了《深入理解ES6》的書(shū)籍來(lái)看,為什么學(xué)習(xí)ES6這么久還要買(mǎi)這本書(shū)呢?主要是看到Daniel A...
摘要:是陷阱函數(shù)對(duì)應(yīng)的反射方法,同時(shí)也是操作的默認(rèn)行為。對(duì)象外形指的是對(duì)象已有的屬性與方法的集合,由于該屬性驗(yàn)證只須在讀取屬性時(shí)被觸發(fā),因此只要使用陷阱函數(shù)。無(wú)論該屬性是對(duì)象自身的屬性還是其原型的屬性。 主要知識(shí)點(diǎn):代理和反射的定義、常用的陷阱函數(shù)、可被撤銷(xiāo)的代理、將代理對(duì)象作為原型使用、將代理作為類(lèi)的原型showImg(https://segmentfault.com/img/bVbfWr...
閱讀 2849·2023-04-26 02:00
閱讀 2808·2019-08-30 15:54
閱讀 901·2019-08-30 11:15
閱讀 1531·2019-08-29 15:31
閱讀 944·2019-08-29 14:12
閱讀 519·2019-08-29 13:08
閱讀 863·2019-08-27 10:51
閱讀 2738·2019-08-26 12:17