Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么Set的prototype方法在调用Object.create(Set.prototype)时抛出错误_Javascript_Ecmascript 6_Set_Prototype_V8 - Fatal编程技术网

Javascript 为什么Set的prototype方法在调用Object.create(Set.prototype)时抛出错误

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.

*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.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不是这样的,因此出现了错误。。。你完全正确,我正在努力推导,非常感谢