介绍五种方式,大多数开发者从未使用过它们,甚至没有听说过。
一个你可以用来实现这种魔法的非常酷的功能
你将看到我们如何使用Symbol构建这些类来实现这一点。
它们的全部内容都是关于完全定制内置操作的正常行为,比如 for..of。这就像在 C++ 和 C# 中的操作符重载一样。
还有 Symbol 类的所有静态方法。
1. Symbol.hasInstance
首先,我们有 Symbol.hasInstance:用于轻松改变 instanceof 运算符行为的方法。
通常情况下,instanceof 是用于检查变量是否是某个类的实例。
正如它应该的那样;非常标准的东西。
但是通过 Symbol.hasInstance,我们可以完全改变 instanceof 的工作方式:
现在,就 instanceof 而言,一个 Person 不再是一个 Person。
如果我们不想完全覆盖它,而是以一种直观的方式扩展它呢?
我们不能在符号内部使用 instanceof,因为那会很快导致无限递归:
相反,我们比较对象的特殊构造函数属性与我们自己的构造函数属性:
如果你刚刚听说 .constructor,这应该解释了一切:
2. Symbol.iterator
我们接下来的“Hack”是 Symbol.iterator,可以完全改变循环在对象上的工作方式和条件。
记住这个:
我们之所以能够做到这一点,多亏了Symbol.iterator :
我们再次看到生成器的出现。
每当我们使用 for..of 时
这是在幕后发生的:
因此,通过 Symbol.iterator,我们完全改变了 for..of 在任何 List 对象上的操作方式:
3. Symbol.toPrimitive
使用 Symbol.toPrimitive,我们很快就能从这个状态转变到:
转变到
我们通过重写 Symbol.toPrimitive 实现了这一点:
现在我们可以在任何需要字符串插值和连接的地方使用 Person 对象:
甚至还有一个提示参数,可以使对象像数字、字符串或其他类型一样运行。
4. Symbol.split
可以将你的自定义对象转换为字符串分隔符:
5. Symbol.search
就像 Symbol.split 一样,将你的自定义对象转换为复杂的字符串搜索工具:
总结
以上就是关于Hack Javascript的五种方式