这真的很困扰我。我可以轻松创建一个继承方法的新类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);
这是一个实施问题吗?还有其他可行的继承模式吗?
不,根据规范,这种行为是正确的。这Set
方法必须在实际集合(使用特定于集合的内部槽初始化的对象)上调用,并且不是通用的Array
方法(基本上适用于所有具有.length
财产)。
As 规范规定:
The Set
构造函数被设计为可子类化。可能会用到
作为一个值extends
的条款class
定义。子类
打算继承指定的构造函数Set
行为必须
包括一个super
致电Set
构造函数来创建和
使用必要的内部状态初始化子类实例
支持Set.prototype
内置方法。
所以你必须使用 ES6 类语法来继承内置函数。
class MySet extends Set {} // default constructor has super() call
var mySet = new MySet();
mySet.add(1);
是否支持此子类化取决于实现,并非所有运行时和转译器都兼容 ES6。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)