成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

well-known Symbol ES6 暴露內(nèi)部操作

QiuyueZhong / 3518人閱讀

摘要:延續(xù)了這個(gè)傳統(tǒng),新標(biāo)準(zhǔn)中主要通過(guò)在原型鏈上定義與相關(guān)的屬性來(lái)暴露更多的語(yǔ)言內(nèi)部邏輯。關(guān)于描述執(zhí)行時(shí)運(yùn)行的內(nèi)部方法。對(duì)于類(lèi)似數(shù)組的對(duì)象,用于時(shí),該對(duì)象整體作為新數(shù)組的元素,重置可改變默認(rèn)行為。

由來(lái)

ES5的一個(gè)中心主旨是將JavaScript中的一些“神奇”的部分暴露出來(lái),并詳盡定義了這些開(kāi)發(fā)者們?cè)诋?dāng)時(shí)模擬不了的功能。ES6延續(xù)了這個(gè)傳統(tǒng),新標(biāo)準(zhǔn)中主要通過(guò)在原型鏈上定義與Symbol相關(guān)的屬性來(lái)暴露更多的語(yǔ)言內(nèi)部邏輯。
MDN 關(guān)于well-known Symbol描述

Symbol.hasInstance

執(zhí)行instanceof時(shí)運(yùn)行的內(nèi)部方法。
每個(gè)函數(shù)都有一個(gè)Symbol.hasInstance 方法,用于確定對(duì)象是否為函數(shù)實(shí)例。該方法被定義在Function.prototype中,所有對(duì)象都繼承了instanceof屬性的默認(rèn)行為,且這個(gè)方法不可寫(xiě)、不可配置和枚舉。

obj instanceof Array;
// 等同于
Array[Symbol.hasInstance](obj);

怎么改寫(xiě)一個(gè)不可寫(xiě)的屬性呢?這個(gè)要使用Object.defineProperty()這個(gè)方法了??梢酝ㄟ^(guò)以下方法進(jìn)行改寫(xiě)instanceof 方法實(shí)現(xiàn)。

function SObject() {}
Object.defineProperty(SObject, Symbol.hasInstance, {
    value: function(v) {
        return false;
    }
});

let obj = new SObject();
console.log(obj instanceof SObject); //false
Symbol.isConcatSpreadable

對(duì)于數(shù)組對(duì)象,默認(rèn)情況下,用于concat時(shí),會(huì)按數(shù)組元素展開(kāi)然后進(jìn)行連接(數(shù)組元素作為新數(shù)組的元素)。重置Symbol.isConcatSpreadable可以改變默認(rèn)行為。
對(duì)于類(lèi)似數(shù)組的對(duì)象,用于concat時(shí),該對(duì)象整體作為新數(shù)組的元素,重置Symbol.isConcatSpreadable可改變默認(rèn)行為。

let collection = {
    0: "Hello",
    1: "world",
    length: 2,
    [Symbol.isConcatSpreadable]: true
}

let messages = [ "Hi"].concat(collection);
console.log(messages.length); // 3
console.log(messages); // (3)?["Hi", "Hello", "world"]

var alpha = ["a", "b", "c"], 
    numeric = [1, 2, 3]; 

numeric[Symbol.isConcatSpreadable] = false;
var alphaNumeric = alpha.concat(numeric); 

console.log(alphaNumeric); // 結(jié)果: ["a", "b", "c", [1, 2, 3] ]

是不是很神奇?我們現(xiàn)在可以編輯影響一些內(nèi)部函數(shù)了!
還有更多內(nèi)部暴露的方法。

與string相關(guān)的Symbol.match、Symbol.replace、Symbol.search和Symbol.split Symbol.toPrimitive 類(lèi)型轉(zhuǎn)換 Symbol.toStringTag

更多屬性參考MDN

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/105620.html

相關(guān)文章

  • 魔幻語(yǔ)言 JavaScript 系列之類(lèi)型轉(zhuǎn)換、寬松相等以及原始值

    摘要:通過(guò)使用其構(gòu)造函數(shù),可以將一個(gè)值的類(lèi)型轉(zhuǎn)換為另一種類(lèi)型。如果使用兩次,可用于將該值轉(zhuǎn)換為相應(yīng)的布爾值。 編譯自:[1] + [2] – [3] === 9!? Looking into assembly code of coercion.全文從兩個(gè)題目來(lái)介紹類(lèi)型轉(zhuǎn)換、寬松相等以及原始值的概念: [1] + [2] – [3] === 9 如果讓 a == true && a == fa...

    li21 評(píng)論0 收藏0
  • 魔幻語(yǔ)言 JavaScript 系列之 a == true && a == fals

    摘要:稍后我們?cè)僭敿?xì)剖析,接下來(lái)先看一個(gè)問(wèn)題。還內(nèi)建了一些在之前沒(méi)有暴露給開(kāi)發(fā)者的,它們代表了內(nèi)部語(yǔ)言行為。使用,可能有不少朋友一開(kāi)始就想到這種方式,簡(jiǎn)單貼一下閱讀更多 在 JavaScript 環(huán)境下,可以讓表達(dá)式 a == true && a == false 為 true 嗎? 就像下面這樣,可以在控制臺(tái)打印出 ’yeah: // code here if (a == true && ...

    BDEEFE 評(píng)論0 收藏0
  • JavaScript 設(shè)計(jì)模式(五):迭代器模式

    摘要:文章內(nèi)容分兩部分前半部分為迭代器模式概念后半部分為中迭代器上半部分開(kāi)始迭代器模式提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中的各個(gè)元素,而又不需要暴露該對(duì)象的內(nèi)部表示。下半部分開(kāi)始的迭代器迭代器等同于遍歷器。執(zhí)行該函數(shù),會(huì)返回一個(gè)遍歷器對(duì)象。 showImg(https://segmentfault.com/img/bVbuyaZ?w=800&h=600); 文章內(nèi)容分兩部分: 前半部分為 迭...

    zhou_you 評(píng)論0 收藏0
  • Javascript Symbol 隱匿的未來(lái)之星

    摘要:通常,它做為一個(gè)偏功能性的標(biāo)記來(lái)表示,在全劇中它是唯一的。并且使用來(lái)生成,會(huì)在存入當(dāng)前全局上下文中一個(gè)結(jié)構(gòu)中,我們稱(chēng)它為顧名思義,它是全局的,所以使用時(shí)我們需要謹(jǐn)慎,尤其是在大型項(xiàng)目中。 ES6中基礎(chǔ)類(lèi)型增加到了7種,比上一個(gè)版本多了一個(gè)Symbol,貌似出現(xiàn)了很長(zhǎng)時(shí)間,但卻因沒(méi)有使用場(chǎng)景,一直當(dāng)作一個(gè)概念層來(lái)理解它,我想,用它的最好的方式,還是要主動(dòng)的去深入了解它吧,所以我從基礎(chǔ)部分...

    wwolf 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<