【问题标题】:How do I convert this ES6 class to a Factory Function?如何将此 ES6 类转换为工厂函数?
【发布时间】:2016-05-25 22:49:08
【问题描述】:

我想我理解not using ES6 classes 的重要性,重视组合而不是继承,以及使用factory functions instead of prototype(如果您不同意这些陈述,请随时纠正我)。

我的问题是如何使用 ES6 类(和 ES6 映射)将此示例转换为使用工厂函数。

class DefaultMap extends Map {
  get(key, defaultValue) {
    return this.has(key) ? super.get(key) : defaultValue;
  }
}

示例:

const defaultMap = new DefaultMap();
defaultMap.set('foo', 'bar');
console.log(defaultMap.has('foo')); // true
console.log(defaultMap.get('foo')); // bar
console.log(defaultMap.has('baz')); // false
console.log(defaultMap.get('baz', 'qux')); // qux

【问题讨论】:

  • 工厂函数不会使用 new 关键字
  • 继承在这里似乎完全合适,因为DefaultMap is-a Map.
  • 其实这是一个不好的继承理由,OP只是给Map添加一个简单的扩展。
  • var factoryFunction = () => new DefaultMap();?你的方法有什么问题?
  • 您只需要将类构造子类化为内置函数。这并不能证明工厂功能是无用的或只是炒作。事实上,它们在许多用例中都很棒。

标签: javascript class ecmascript-6 factory


【解决方案1】:

如果您所做的只是向Map 添加一个函数,那么您的方法没有任何问题。我什至认为这是解决问题的首选方式。但是如果你真的想要一个工厂函数而不是继承,你可以这样完成它:

function createMap() {
  var map = new Map();
  var oldGet = map.get;
  map.get = function(key, defaultValue) {
    return this.has(key) ? oldGet.call(this, key) : defaultValue;
  };
  return map;
}

const defaultMap = createMap();
...

【讨论】:

  • 我刚刚放弃了我的答案,因为其中的代码实际上与您的相同。 IMO OP 让自己卷入了一场似乎有些教条的宗教战争。对我来说,最实用的方法确实是使用继承,但类似地,一个快速的猴子补丁也可以完成这项工作,并且可能被认为更惯用 w.r.t.当前的 JS 趋势。课程用马。
  • 我确实感觉自己陷入了一场圣战,并且像您所说的那样,确实过于关注当前的 JS 趋势。我将继续以课堂方式进行,但 Mike 的方式似乎也更适合在实例化时设置默认值。
  • @spender 工厂函数也提供继承,除了map等内置函数的子类化。工厂根本不依赖于构造函数和new。就这样。没有宗教战争,无处可去。
猜你喜欢
  • 2019-12-11
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 2020-03-07
  • 2018-12-04
  • 1970-01-01
  • 2020-06-16
  • 2021-03-02
相关资源
最近更新 更多