well-known Symbol ES6 暴露內部操做

由來

ES5的一箇中心主旨是將JavaScript中的一些「神奇」的部分暴露出來,並詳盡定義了這些開發者們在當時模擬不了的功能。ES6延續了這個傳統,新標準中主要經過在原型鏈上定義與Symbol相關的屬性來暴露更多的語言內部邏輯。
MDN 關於well-known Symbol描述數組

Symbol.hasInstance

執行instanceof時運行的內部方法。
每一個函數都有一個Symbol.hasInstance 方法,用於肯定對象是否爲函數實例。該方法被定義在Function.prototype中,全部對象都繼承了instanceof屬性的默認行爲,且這個方法不可寫、不可配置和枚舉。函數

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

怎麼改寫一個不可寫的屬性呢?這個要使用Object.defineProperty()這個方法了。能夠經過如下方法進行改寫instanceof 方法實現。prototype

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

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

Symbol.isConcatSpreadable

對於數組對象,默認狀況下,用於concat時,會按數組元素展開而後進行鏈接(數組元素做爲新數組的元素)。重置Symbol.isConcatSpreadable能夠改變默認行爲。
對於相似數組的對象,用於concat時,該對象總體做爲新數組的元素,重置Symbol.isConcatSpreadable可改變默認行爲。code

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); // 結果: ['a', 'b', 'c', [1, 2, 3] ]

是否是很神奇?咱們如今能夠編輯影響一些內部函數了!
還有更多內部暴露的方法。對象

與string相關的Symbol.match、Symbol.replace、Symbol.search和Symbol.split

Symbol.toPrimitive 類型轉換

Symbol.toStringTag

更多屬性參考MDN繼承

相關文章
相關標籤/搜索