Inheriting from Set.prototype(继承自 Set.prototype)
问题描述
这真的让我很烦.我可以轻松地创建一个继承 Array.prototype 方法的新类:
var MyArray = function() {};MyArray.prototype = Array.prototype;var myArray = new MyArray();myArray.push(1);//这是允许的同样的继承模式似乎不适用于 Set.prototype:
var MySet = function() {};MySet.prototype = Set.prototype;var mySet = new MySet();mySet.add(1);//TypeError: 方法 Set.prototype.add 在不兼容的接收器上调用这是一个实施问题吗?是否有另一种可以工作的继承模式?我已经在节点 v0.12 和 Canary 中尝试过,结果相同.
这个解决方案有效,但我仍然不确定为什么上面的工作不一样:
var MySet = function(array) {var inst = new Set(array);inst.__proto__ = MySet.prototype;返回机构;}MySet.prototype = Object.create(Set.prototype);这是一个实施问题吗?是否有另一种继承模式可行?
不,按照规范,这种行为是正确的.
Set方法必须在实际集合(使用集合特定的内部槽初始化的对象)上调用,并且不像Array方法(基本上适用于所有具有.length属性).正如规范声明:p><块引用>
Set构造函数被设计为可子类化.它可以用来作为class定义的extends子句中的值.子类打算继承指定Set行为的构造函数必须包括对Set构造函数的super调用以创建和用必要的内部状态初始化子类实例支持Set.prototype内置方法.
所以你将不得不使用 ES6 类语法来继承内置函数.
class MySet extends Set {}//默认构造函数有 super() 调用var mySet = new MySet();mySet.add(1);是否支持这种子类化取决于实现,并非所有运行时和转译器都符合 ES6.
This is really bugging me. I can easily create a new class that inherits methods from Array.prototype:
var MyArray = function() {};
MyArray.prototype = Array.prototype;
var myArray = new MyArray();
myArray.push(1); // this is allowed
The same inheritance pattern doesn't seem to work with 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
Is this an implementation issue? Is there another inheritance pattern that will work? I've tried this in node v0.12 and Canary with the same results.
EDIT: This solution works, but I'm still not sure why the above doesn't work the same:
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?
No, this behaviour is correct as by the spec. The Set methods must be invoked on actual sets (objects initialised with set-specific internal slots), and are not generic as the Array methods (which basically work on everything that has a .length property).
As the spec states:
The
Setconstructor is designed to be subclassable. It may be used as the value in anextendsclause of aclassdefinition. Subclass constructors that intend to inherit the specifiedSetbehaviour must include asupercall to theSetconstructor to create and initialize the subclass instance with the internal state necessary to support theSet.prototypebuilt-in methods.
So you will have to use ES6 class syntax to inherit from the built-ins.
class MySet extends Set {} // default constructor has super() call
var mySet = new MySet();
mySet.add(1);
Whether this subclassing is supported depends on the implementation, not all runtimes and transpilers are ES6-compliant yet.
这篇关于继承自 Set.prototype的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:继承自 Set.prototype
基础教程推荐
- 检查 HTML5 拖放文件类型 2022-01-01
- npm start 错误与 create-react-app 2022-01-01
- 即使用户允许,Gmail 也会隐藏外部电子邮件图片 2022-01-01
- 在 contenteditable 中精确拖放 2022-01-01
- fetch 是否支持原生多文件上传? 2022-01-01
- 如何添加到目前为止的天数? 2022-01-01
- 原生拖动事件后如何获取 mouseup 事件? 2022-01-01
- Bootstrap 模态出现在背景下 2022-01-01
- Bokeh Div文本对齐 2022-01-01
- Fabric JS绘制具有活动形状的多边形 2022-01-01
