映射函数不适用于扩展数组的 class

map function not working with class that extends array

我有一个 class 扩展数组

class PositionsAndMedia extends Array {
    constructor(x) {
        super(...x.map(x => new MyClass(x)));
    }
}

class 构造函数接收一个对象数组并用 MyClass 转换每个对象

一切似乎都很完美,但如果我尝试:

positionsAndMediaInTree = new PositionsAndMedia(myArray)
positionsAndMediaInTree.splice(matchingIndex, 1);

我在浏览器中收到此错误:

classes.js:73 Uncaught TypeError: positionsAndMedia.map is not a function
    at new PositionsAndMedia (classes.js:73)
    at PositionsAndMedia.slice (<anonymous>)
    at <anonymous>:1:34

第 73 行是 class 定义中的 super(....) 行。

由于 PositionsAndMedia class 扩展数组 class,我假设 map() 方法可用于 PositionsAndMedia class.

为什么会出现此错误?我怎样才能避免它?

您的错误消息显示 slice,而不是 splice,并且该错误对 slice 有意义(但对 splice 无效)。

您的 PositionsAndMedia 构造函数假定它始终将数组作为参数,但这并不总是正确的。 slice 创建并 returns 一个新数组,它 returns 通过调用数组子类(PositionsAndMedia 在您的情况下)的构造函数来创建新数组而不带任何参数。其他数组方法,例如 mapfilter,也是这样做的。

数组子类构造函数必须允许 Array 允许的所有类型的参数:

  • None 根本
  • 单个数字设置长度
  • 一个non-number,或多个参数,设置初始内容

修复它的最小更改可能如下所示:

class PositionsAndMedia extends Array {
    constructor(x, ...rest) {
        if (Array.isArray(x)) {
            // You might consider doing something with `rest` here, too,
            // since otherwise any other arguments are ignored
            super(...x.map(x => new MyClass(x)));
        } else {
            // Default behavior
            super(x, ...rest);
        }
    }
}