ES5的一箇中心主旨是將JavaScript中的一些「神奇」的部分暴露出來,並詳盡定義了這些開發者們在當時模擬不了的功能。ES6延續了這個傳統,新標準中主要經過在原型鏈上定義與Symbol相關的屬性來暴露更多的語言內部邏輯。
MDN 關於well-known Symbol描述數組
執行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
對於數組對象,默認狀況下,用於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] ]
是否是很神奇?咱們如今能夠編輯影響一些內部函數了!
還有更多內部暴露的方法。對象