gpt4 book ai didi

javascript - 继承自 Set.prototype

转载 作者:搜寻专家 更新时间:2023-11-01 04:16:17 25 4
gpt4 key购买 nike

这真的很烦我。我可以轻松地创建一个新类,它从 Array.prototype 继承方法:

var MyArray = function() {};

MyArray.prototype = Array.prototype;

var myArray = new MyArray();
myArray.push(1); // this is allowed

相同的继承模式似乎不适用于 Set.prototype:

var MySet = function() {};

MySet.prototype = Set.prototype;

var mySet = new MySet();
mySet.add(1); // TypeError: Method Set.prototype.add called on incompatible receiver

这是一个实现问题吗?是否有其他可行的继承模式?我在节点 v0.12 和 Canary 中试过这个,结果相同。

编辑:这个解决方案有效,但我仍然不确定为什么上面的方法不一样:

var MySet = function(array) {
var inst = new Set(array);
inst.__proto__ = MySet.prototype;
return inst;
}

MySet.prototype = Object.create(Set.prototype);

最佳答案

Is this an implementation issue? Is there another inheritance pattern that will work?

不,根据规范,此行为是正确的。 Set 方法必须在实际集合(使用集合特定的内部槽初始化的对象)上调用,并且不像 Array 方法那样通用(它基本上适用于所有具有.length 属性)。

作为the spec states :

The Set constructor is designed to be subclassable. It may be used as the value in an extends clause of a class definition. Subclass constructors that intend to inherit the specified Set behaviour must include a super call to the Set constructor to create and initialize the subclass instance with the internal state necessary to support the Set.prototype built-in methods.

所以你将不得不使用 ES6 类语法来继承内置函数。

class MySet extends Set {} // default constructor has super() call

var mySet = new MySet();
mySet.add(1);

是否支持此子类化取决于实现,并非所有运行时和转译器都符合 ES6。

关于javascript - 继承自 Set.prototype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29782259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com