何时未定义扩展阵列映射

时间:2018-01-30 15:37:46

标签: javascript arrays ecmascript-6

我正在尝试扩展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时。

2 个答案:

答案 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);