元編程就是指以操作目標(biāo)為程序本身的行為特性的編程,而在ES6中增加了類(lèi)型symbol,除了自定義的符號(hào)之外,還預(yù)定義了其他的一些內(nèi)置符號(hào),可以被稱(chēng)為內(nèi)置符號(hào)。下面就來(lái)給大家介紹一下這些內(nèi)置符號(hào)。
1. Symbol.iterator
這個(gè)符號(hào)表示任意對(duì)象上的一個(gè)專(zhuān)門(mén)的屬性,語(yǔ)言機(jī)制會(huì)自動(dòng)的在這個(gè)屬性上尋找一個(gè)方法,這個(gè)方法會(huì)構(gòu)造一個(gè)迭代器來(lái)消耗這個(gè)對(duì)象的值。… 展開(kāi)和 for…of 循環(huán)會(huì)自動(dòng)使用它。
我們也可以通過(guò)自定義 Symbol.iterator 屬性為任意對(duì)象值定義自己的迭代器邏輯,它將覆蓋默認(rèn)的迭代器。我們相當(dāng)于是定義了一種元編程的行為,提供給JavaScript其他部分(也就是運(yùn)算符和循環(huán)結(jié)構(gòu))在處理定義的對(duì)象時(shí)使用。
web前端培訓(xùn)1" />
2. Symbol.toStringTag 與 Symbol.hasInstance
在日常邏輯中經(jīng)常出現(xiàn)的一個(gè)場(chǎng)景,判斷一個(gè)值是什么類(lèi)型,通常使用的是 toString() 和 instanceof 。
現(xiàn)在 ES6 中,可以定義這些操作的行為特性了。
通過(guò)以上案例我們可以看出:
toStringTag 符號(hào)指定了在 [object XXXX] 字符串化時(shí)使用的字符串值。
hasInstance 符號(hào)是在構(gòu)造器函數(shù)上的一個(gè)方法,接受實(shí)例對(duì)象值,通過(guò)返回 true 或者 false 來(lái)顯示這個(gè)值是否可以被認(rèn)為是一個(gè)實(shí)例。
在 Function.prototype 上 hasInstance 默認(rèn)的 writable 是 false,不可寫(xiě)入??梢酝ㄟ^(guò) Object.defineProperty() 來(lái)繞開(kāi)它。
3. Symbol.species
這個(gè)符號(hào)控制要生成新的實(shí)例時(shí),類(lèi)的內(nèi)置方法使用哪一個(gè)構(gòu)造器。 內(nèi)置原生構(gòu)造器 Symbol.species 的默認(rèn)行為是 return this 。 如果要定義生成新的實(shí)例的方法,使用new this.constructorSymbol.species ,然后繼承的類(lèi)就可以根據(jù)它來(lái)控制由哪個(gè)構(gòu)造器來(lái)產(chǎn)生這些實(shí)例。
4. Symbol.toPrimitive
在ES6之前,對(duì)象為了某個(gè)操作(例如相加 + 或比較 == )必須強(qiáng)制轉(zhuǎn)換為原生類(lèi)型時(shí),是無(wú)法控制該行為的 ,現(xiàn)在可以通過(guò)Symbol.toPrimitive這個(gè)符號(hào)來(lái)控制這個(gè)行為。
Symbol.toPrimitive 方法根據(jù)調(diào)用 ToPrimitive 的運(yùn)算期望的類(lèi)型,會(huì)提供一個(gè)類(lèi)型(type) 指定 "string"、"number" 或 "default"。
以上就是es6 symbol的介紹了,歡迎對(duì)其他前端技術(shù)感興趣的同學(xué)來(lái)到千鋒web前端培訓(xùn)班了解我們的大前端培訓(xùn)課程,全程名師面授確保教學(xué)質(zhì)量,現(xiàn)在咨詢(xún)還有全套免費(fèi)學(xué)習(xí)資料可以領(lǐng)取,趕緊來(lái)了解一下吧。