javascript - 为什么 Set 的原型(prototype)方法在调用 Object.create(Set.prototype) 时会抛出错误

标签 javascript ecmascript-6 set prototype v8

*Chrome 控制台:*

let a = Object.create(Set.prototype);
a instanceof Set    // true
a.add(1);    // Uncaught TypeError: Method Set.prototype.add called on incompatible receiver #<Set>
Set.prototype.add.call(a);    // the same as above

这确实令人困惑。

最佳答案

简而言之:您不能这样做,因为规范规定您不能这样做。

请参阅 Set.prototype.add 的第 3 步:

If S does not have a [[SetData]] internal slot, throw a TypeError exception.

此限制的原因是 Set 方法需要它们所操作的对象具有特定的内部状态。拥有正确的原型(prototype)是不够的;还需要有正确的原型(prototype)。您还必须为对象调用 Set 构造函数,这将创建这些内部字段。

我猜您想要做的是对内置Set进行子类化。正如规范还指出的那样,使用 ES6 类语法可以轻松实现这一点:

class MySet extends Set {}
var s = new MySet();
s.add(1);

另请参阅此问题:Inheriting from Set.prototype .

关于javascript - 为什么 Set 的原型(prototype)方法在调用 Object.create(Set.prototype) 时会抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48728721/

相关文章:

javascript - 如何检测浏览器未最小化且相关选项卡未处于非事件状态

javascript - react 和流动 : import Node type and PureComponent in one line

javascript - 在 node.js 中验证一个集合是否为空

javascript - ES6 迭代器的用例

javascript - 如何在 webpack 中导入 jquery

c++ - 带有标准容器的 std::shared_ptr

ruby - 在一次操作中从 Ruby Set 中获取和删除元素

javascript - lodash:将属性插入同一对象中的另一个属性

javascript - php 联系表单返回字段名称而不是值

javascript - 在 onclick 事件之后为每个链接分配一个函数