Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将此ES6类转换为工厂函数?_Javascript_Class_Ecmascript 6_Factory - Fatal编程技术网

Javascript 如何将此ES6类转换为工厂函数?

Javascript 如何将此ES6类转换为工厂函数?,javascript,class,ecmascript-6,factory,Javascript,Class,Ecmascript 6,Factory,我想我理解,重视组合而不是继承和使用(如果你不同意,请随时纠正我的任何说法)的重要性 我的问题是如何使用ES6类(和ES6映射)将此示例转换为使用工厂函数 class DefaultMap extends Map { get(key, defaultValue) { return this.has(key) ? super.get(key) : defaultValue; } } 例如: const defaultMap = new DefaultMap(); defaultM

我想我理解,重视组合而不是继承和使用(如果你不同意,请随时纠正我的任何说法)的重要性

我的问题是如何使用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

如果您所做的只是向
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();
...

工厂函数不会使用新的关键字继承在这里似乎是完全合适的,因为
DefaultMap
is-A
Map
。实际上这是一个不好的继承理由,OP只是在Map上添加了一个简单的扩展。
var factoryFunction=()=>new DefaultMap()?你的方法有什么问题吗?你只需要类构造来为内置的子类。这并不能证明工厂功能是无用的,或者仅仅是一种宣传。事实上,它们在许多用例中都非常棒。我放弃了我的答案,因为其中的代码实际上与您的完全相同。在我看来,OP让自己卷入了一场似乎有些教条的宗教战争。对我来说,最实用的方法确实是使用继承,但类似地,一个快速的monkey补丁也可以做到这一点,并且可能被认为是更惯用的w.r.t.当前JS趋势。我肯定觉得自己被卷入了一场圣战,而且我肯定太专注于做你所说的w.r.t当前JS趋势的事情了。我本来打算继续用类的方式来做,但Mike的方式似乎更适合在实例化时设置默认值。@spender工厂函数也提供继承,但内置函数的子类(如map)除外。工厂根本不依赖构造函数和
new
。这就是全部。没有宗教战争,没有地方。