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] ]
是否是很神奇?咱们如今能够编辑影响一些内部函数了!
还有更多内部暴露的方法。对象