资讯专栏INFORMATION COLUMN

well-known Symbol ES6 暴露内部操作

QiuyueZhong / 3346人阅读

摘要:延续了这个传统,新标准中主要通过在原型链上定义与相关的属性来暴露更多的语言内部逻辑。关于描述执行时运行的内部方法。对于类似数组的对象,用于时,该对象整体作为新数组的元素,重置可改变默认行为。

由来

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 方法实现。

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可改变默认行为。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105620.html

相关文章

  • 魔幻语言 JavaScript 系列之类型转换、宽松相等以及原始值

    摘要:通过使用其构造函数,可以将一个值的类型转换为另一种类型。如果使用两次,可用于将该值转换为相应的布尔值。 编译自:[1] + [2] – [3] === 9!? Looking into assembly code of coercion.全文从两个题目来介绍类型转换、宽松相等以及原始值的概念: [1] + [2] – [3] === 9 如果让 a == true && a == fa...

    li21 评论0 收藏0
  • 魔幻语言 JavaScript 系列之 a == true && a == fals

    摘要:稍后我们再详细剖析,接下来先看一个问题。还内建了一些在之前没有暴露给开发者的,它们代表了内部语言行为。使用,可能有不少朋友一开始就想到这种方式,简单贴一下阅读更多 在 JavaScript 环境下,可以让表达式 a == true && a == false 为 true 吗? 就像下面这样,可以在控制台打印出 ’yeah: // code here if (a == true && ...

    BDEEFE 评论0 收藏0
  • JavaScript 设计模式(五):迭代器模式

    摘要:文章内容分两部分前半部分为迭代器模式概念后半部分为中迭代器上半部分开始迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。下半部分开始的迭代器迭代器等同于遍历器。执行该函数,会返回一个遍历器对象。 showImg(https://segmentfault.com/img/bVbuyaZ?w=800&h=600); 文章内容分两部分: 前半部分为 迭...

    zhou_you 评论0 收藏0
  • Javascript Symbol 隐匿的未来之星

    摘要:通常,它做为一个偏功能性的标记来表示,在全剧中它是唯一的。并且使用来生成,会在存入当前全局上下文中一个结构中,我们称它为顾名思义,它是全局的,所以使用时我们需要谨慎,尤其是在大型项目中。 ES6中基础类型增加到了7种,比上一个版本多了一个Symbol,貌似出现了很长时间,但却因没有使用场景,一直当作一个概念层来理解它,我想,用它的最好的方式,还是要主动的去深入了解它吧,所以我从基础部分...

    wwolf 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<