函数式编程和ES6数组子类化

时间:2015-06-15 12:37:04

标签: javascript arrays ecmascript-6

我正在Javascript ES6中对数组进行子类化,如下所示:

export class MyList extends Array {
  constructor(...args) {
      super(...args);
  }
}

但是,一旦我使用mapfilter等功能方法,它们将再次返回正常的Javascript数组。

let myList = new MyList();
myList[0] = {id: 'a', name: 'Tom'};
myList[1] = {id: 'b', name: 'Alice'};

let mapedList = myList.map((elem) => elem.name);

console.log(myList instanceof MyList); // true
console.log(myList instanceof Array); // true

console.log(mapedList instanceof MyList); // false
console.log(mapedList instanceof Array); // true

那么如何在不遇到所有这些问题的情况下正确地对Javascript数组进行子类化呢?

1 个答案:

答案 0 :(得分:0)

您可以实施名为static的小型from功能,该功能可以使用ECMAScript 2015' 将结果Array 转换为MyList。 s Reflection API

您的class将如下所示:

export class MyList extends Array {
  constructor(...args) {
    super(...args);
  }

  static from(arr) {
    Reflect.setPrototypeOf(arr, new MyList);
    return arr;
  }
}

然后,在您的代码中,您只需将map调用包含在from函数调用中,如下所示:

let mapedList = MyList.from(myList.map((elem) => elem.name));

您还可以对其进行修改,以支持objects更多类型的Array.from