尝试从ecmascript 6中提供的新Set
继承时遇到问题。该类定义如下:
function SelectionManager () {
Set.call(this);
}
SelectionManager.prototype = Object.create(Set.prototype);
SelectionManager.prototype.add = function (unit) {
unit.setIsSelected(true);
Set.prototype.add.call(this, unit);
};
/* Some functions left out */
尝试拨打add
时出现以下错误:TypeError: Set operation called on non-Set object
该代码位于http://jsfiddle.net/6nq1gqx7/
draft for ES6明确指出应该可以将Set子类化,这样做的正确方法是什么?
答案 0 :(得分:1)
答案 1 :(得分:1)
现在没有正确的方法。 Chrome / V8(和其他大多数浏览器一样)还没有正确支持内置类的子类化 - 部分原因是它实现起来可能非常复杂,部分原因是精确的语义仍然在不断变化,而且刚刚被推翻了最新的ES6会议,尚无最终决议(截至2014年10月)。
答案 2 :(得分:0)
在Chrome,Firefox和Edge(但不是IE11)中,您可以使用此解决方法对ES6 Set和Map进行子类化,使用ES6类完成:
class MySet extends Set {
constructor() {
// instead of super(), you must write:
const self = new Set();
self.__proto__ = MySet.prototype;
return self;
}
// example method:
add(item) {
console.log('added!')
super.add(item); // Or: Set.prototype.add.call(this, item);
}
}
var mm = new MySet();
console.log(mm.size); // logs 0
mm.add(5); // logs 'added!'
console.log(mm.size); // logs 1