因此,阅读地图物种的文档:
在派生集合对象(例如,自定义映射MyMap)中,MyMap类型是MyMap构造函数。但是,为了在派生类方法中返回父Map对象,您可能需要重写它
然而,Map似乎没有任何方法来处理这个问题。例如,我看到的唯一返回Map的Map方法是set,但是设置物种不会改变map.set(...) instanceof的结果。
那么,对于Map对象,物种的用途是什么?
我的测试:
class MapA extends Map {
static get [Symbol.species]() {return Map}
}
class MapB extends Map {
static get [Symbol.species]() {return MapB}
}
let ma = new MapA
let mb = new MapB
console.log("ma instanceof Map",ma instanceof Map)
console.log("ma instanceof MapA",ma instanceof MapA)
console.log("ma.set instanceof Map",ma.set(1,1) instanceof Map)
console.log("ma.set instanceof MapA",ma.set(1,1) instanceof MapA)
console.log("mb instanceof Map",mb instanceof Map)
console.log("mb instanceof MapB",mb instanceof MapB)
console.log("mb.set instanceof Map",mb.set(1,1) instanceof Map)
console.log("mb.set instanceof MapB",mb.set(1,1) instanceof MapB)我的测试输出:
ma instanceof Map true
ma instanceof MapA true
ma.set instanceof Map true
ma.set instanceof MapA true
mb instanceof Map true
mb instanceof MapB true
mb.set instanceof Map true
mb.set instanceof MapB true我的测试显示,我所知道的唯一返回Map实例的Map方法忽略了这个物种,只返回了它被调用的类的一个实例
发布于 2021-05-04 06:45:59
物种模式只与创建新实例有关。set返回调用它的Map,因此它不使用[Symbol.species]。
Map目前没有任何创建新Map实例的方法,但至少可以看到为其定义[Symbol.species]的两个原因:
Map子类很可能定义一个返回新实例的方法,在这种情况下,它可能使用物种模式,即使Map本身不使用。Map的未来添加--创建实例的新方法很可能在某个阶段添加到Map中。Set也有[Symbol.species],也没有任何创建新实例的方法--和。有一个关于新方法的建议将创建intersection和union等实例。
由于添加物种模式是为了很好地处理数组子类(因为数组具有创建新实例的slice和map等方法),因此将其应用于可能在某个时候具有创建新实例的方法的其他容器类和子类使用是有意义的。
https://stackoverflow.com/questions/67379843
复制相似问题