*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/