Javascript 为什么Set的prototype方法在调用Object.create(Set.prototype)时抛出错误
*Chrome控制台:*Javascript 为什么Set的prototype方法在调用Object.create(Set.prototype)时抛出错误,javascript,ecmascript-6,set,prototype,v8,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 let a=Object.
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
let a=Object.create(Set.prototype);
Set//true的实例
a、 加(1);//未捕获的TypeError:在不兼容的接收器上调用了方法Set.prototype.add#
Set.prototype.add.call(a);//同上
这真令人困惑
let a = Object.create(Set.prototype);
Object.create()
方法使用指定的原型对象和属性创建一个新对象
在我们的例子中,Object.create()
创建一个newset()
的新对象,它将继承Set实例的所有属性和方法
使用Set对象可以存储任何类型的唯一值,无论是基元值还是对象引用
在参数Set.prototype
的帮助下,您可以使用构造函数的prototype对象向所有Set实例添加属性或方法
a instanceof Set
它确认实例a
是Set
对象的实例,在我们的例子中是的
a.add(1);
对象没有方法add()
您在没有实现的情况下调用该方法
Set.prototype.add() or
a.add()
在这两种情况下,您都可以尝试通过对象实例a
调用add()
方法,并且a
对象没有add()
方法
add()
方法与Set
类相关
var oSet = new Set();
var CustomSet = Object.create(oSet);
console.log(CustomSet.__proto__.add(10));
当您在控制台中运行上述代码时,您将看到它将在集合中推送值10
\uuuu proto\uuu
是查找链中用于解析方法等的实际对象
prototype是使用新建
创建对象时用于构建的对象
因此,prototype在实例本身(或其他对象)上不可用,而仅在构造函数上可用。简而言之:您不能这样做,因为规范说您不能这样做
参见以下步骤3:
如果S没有[[SetData]]内部插槽,则引发TypeError异常
此限制的原因是Set
方法需要在其操作的对象中具有特定的内部状态。拥有正确的原型是不够的;还必须为对象调用Set
构造函数,该构造函数将创建这些内部字段
我猜您要做的是将内置的集合子类化。规范还指出,使用ES6类语法很容易做到:
class MySet extends Set {}
var s = new MySet();
s.add(1);
另请看这个问题:.uh-我仍然有点困惑,Set
的一个实例表明a
确实是Set
的一个实例,为什么它不能在Set
的原型链上调用一个方法呢?@NianyiWang在浏览了一些博客之后,我会找到解决方案并更新和回答。调用构造函数和调用Object.create是两回事。当您调用new Set时,会创建一个新的Set对象并正确初始化。Object.create不是这样的,因此出现了错误。。。你完全正确,我正在努力推导,非常感谢