Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.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 关于地图物种记录(和目的)的混淆_Javascript_Node.js - Fatal编程技术网

Javascript 关于地图物种记录(和目的)的混淆

Javascript 关于地图物种记录(和目的)的混淆,javascript,node.js,Javascript,Node.js,因此,阅读地图物种的文档: 在派生的集合对象(例如,您的自定义映射MyMap)中,MyMap种类是MyMap构造函数。但是,为了在派生类方法中返回父映射对象,您可能希望覆盖此内容 然而,Map似乎并没有任何方法能够真正处理这个问题。例如,我看到的唯一返回Map的Map方法是set,但是设置species不会改变Map.set(…)instanceof的结果 那么,物种对于地图对象的目的是什么呢 我的测试: class MapA extends Map { static get [Symb

因此,阅读地图物种的文档:

在派生的集合对象(例如,您的自定义映射MyMap)中,MyMap种类是MyMap构造函数。但是,为了在派生类方法中返回父映射对象,您可能希望覆盖此内容

然而,Map似乎并没有任何方法能够真正处理这个问题。例如,我看到的唯一返回Map的Map方法是
set
,但是设置species不会改变
Map.set(…)instanceof
的结果

那么,物种对于地图对象的目的是什么呢

我的测试:

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方法忽略了物种,只返回它所调用的类的实例。物种模式只与创建新的实例有关
set
返回您调用它的
Map
,因此它不使用
[Symbol.species]

Map
目前没有任何方法可以创建新的
Map
实例,但我可以看到至少有两个原因定义了
[Symbol.species]

  • 子类-一个
    Map
    子类可以定义一个返回新实例的方法,在这种情况下,它可以使用物种模式,即使
    Map
    本身不使用
  • 将来添加到
    Map
    ——在某个阶段,创建实例的新方法很可能会添加到
    Map
  • Set
    还具有
    [Symbol.species]
    ,并且还没有任何创建新实例的方法-。有一个将创建诸如
    交叉点
    联合
    等实例的


    由于添加了物种模式以很好地处理数组子类(因为数组具有创建新实例的
    slice
    map
    等方法),因此将其应用于其他容器类是有意义的,这些容器类在某个时候可能具有创建新实例的方法,并且子类可以使用。

    令人惊讶地说。谢谢你的澄清!