Javascript 映射函数不使用扩展数组的类
我有一个扩展数组的类Javascript 映射函数不使用扩展数组的类,javascript,arrays,es6-class,Javascript,Arrays,Es6 Class,我有一个扩展数组的类 class PositionsAndMedia extends Array { constructor(x) { super(...x.map(x => new MyClass(x))); } } 类构造函数接收一个对象数组,并使用MyClass转换每个对象 一切似乎都很完美,但如果我尝试: positionsAndMediaInTree = new PositionsAndMedia(myArray) positionsAndMed
class PositionsAndMedia extends Array {
constructor(x) {
super(...x.map(x => new MyClass(x)));
}
}
类构造函数接收一个对象数组,并使用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
classes.js:73未捕获类型错误:positionsAndMedia.map不是函数
在新位置和媒体(classes.js:73)
在位置sandmedia.slice()处
时间:1:34
第73行是类定义中的super(..)
行
由于PositionsAndMedia
类扩展了数组类,因此我假设map()
方法可用于PositionsAndMedia
类
为什么会出现这个错误?如何避免它?您的错误消息显示的是
slice
,而不是splice
,并且该错误对于slice
(但对于splice
)是有意义的
您的PositionsAndMedia
构造函数假定它总是获取一个数组作为参数,但这并不总是正确的slice
创建并返回一个新数组,它通过调用数组子类的构造函数(在本例中为PositionsAndMedia
)创建它返回的新数组,而不带任何参数。其他数组方法,如map
和filter
,也可以这样做
数组子类构造函数必须允许Array
允许的所有类型的参数:
- 一点也没有
- 设置长度的单个数字
- 用于设置初始内容的非数字或多个参数
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);
}
}
}
您的错误消息与代码不匹配(
positionsAndMedia
vs.positionsAndMedia intree
,slice
vs.splice
)。请使用演示问题的示例更新您的问题,最好是使用堆栈片段([]
工具栏按钮)运行的问题。