映射函数不适用于扩展数组的 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
在您的情况下)的构造函数来创建新数组而不带任何参数。其他数组方法,例如 map
和 filter
,也是这样做的。
数组子类构造函数必须允许 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);
}
}
}
我有一个 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
在您的情况下)的构造函数来创建新数组而不带任何参数。其他数组方法,例如 map
和 filter
,也是这样做的。
数组子类构造函数必须允许 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);
}
}
}