【问题标题】:Subclassing ES6 Set in javascript在 javascript 中子类化 ES6 Set
【发布时间】:2014-10-08 11:26:35
【问题描述】:

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

【问题讨论】:

  • Uncaught ReferenceError: Set is not defined。 Chrome(37)似乎对 ES6 不太满意
  • 嗯,似乎它在 Chrome 38 中可用。在 Chrome 31 中启用了 Enable Experimental JavaScript 标志... Chrome 38 昨天升级为稳定版,它应该会在附近自动更新未来。
  • 啊,是的,看来浏览器只是在等待重启,更新已经下载:P
  • 阅读"How ECMAScript 5 still does not allow to subclass array" 提供了一种解决方法,但他们描述的问题不应该真正适用于Set,特别是因为规范说它应该是可子类化的。解决方法是将构造函数更改为var set = new Set();set.__proto__ = SelectionManager.prototype;return set;,虽然看起来很脏……

标签: javascript set ecmascript-6 ecmascript-harmony


【解决方案1】:

【讨论】:

    【解决方案2】:

    目前没有正确的方法。 Chrome/V8(与大多数其他浏览器一样)还没有正确支持内置函数的子类化——部分原因是它实现起来可能相当复杂,部分原因是精确的语义仍然在不断变化,并且刚刚在最新的 ES6 会议,还没有最终决议(截至 2014 年 10 月)。

    【讨论】:

      【解决方案3】:

      在 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-04
        • 2018-02-24
        • 2020-09-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-03
        • 2019-11-18
        • 1970-01-01
        相关资源
        最近更新 更多