我正在尝试扩展Array,以便我可以添加自己的附加功能。我已经读过扩展Array.prototype可能很危险,所以我试图用类继承的正确方法来做它。
我遇到的问题是地图未定义。我显然可以解决这个问题,但我不明白为什么我在扩展Array,因此应该有它的功能?
export default class Array2 extends Array {
constructor(items) {
super(...items);
}
addOne() {
return this.map((x)=>{
return x+1;
})
}
}
let arry2 = new Array2 ([9, 1, 4, 0]).addOne();
console.log(arry2);
我希望将Array2(4)[10,2,5,1]登录到控制台,但我会抛出以下错误。
Uncaught TypeError: undefined is not a function
修改 删除构造函数似乎解决了问题,但没有解释当构造函数存在时它失败的原因。特别是当构造函数只是调用super时。
答案 0 :(得分:1)
使用
进行调试constructor(items) {
console.log(...arguments);
super(...items);
}
可能会对此有所了解。在map
中,创建了一个类型为Array2
的新数组 - 它正在调用具有所需长度4
的构造函数 - 就像标准Array
支持此。但是,您正在将参数items
传播到超级调用中,该调用将尝试迭代值4
- 并且显然它不可迭代,因为" { {1}}不是函数" (好吧,这是应该的消息)。
要避免这种情况,请使用标准构造函数签名,并将任何参数直接传递给super。或者只是省略4[Symbol.iterator]()
,因为默认构造函数将为您执行此传递。
使用
constructor
那是export default class Array2 extends Array {
addOne() {
return this.map((x)=>{
return x+1;
})
}
}
const array2 = Array2.from([9, 1, 4, 0]).addOne();
const array3 = Array2.of(9, 1, 4, 0).addOne();
console.log(array2, array3);
和of
的用途。
答案 1 :(得分:0)
您在错误的地方使用了差价运营商。 https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/Spread_operator
我想你想在构造函数中获得更多参数。
class Array2 extends Array {
constructor(items) {
super(items); //here is the problem
}
addOne() {
return this.map( (x) => {
return x+1;
} );
}
}
let arry2 = Array2.from([2, 1, 4, 22]).addOne();
console.log("arry2", arry2);