在javascript中对ES6进行子类化

时间:2014-10-08 11:26:35

标签: javascript set ecmascript-6 ecmascript-harmony

尝试从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子类化,这样做的正确方法是什么?

3 个答案:

答案 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