我正在Javascript ES6中对数组进行子类化,如下所示:
export class MyList extends Array {
constructor(...args) {
super(...args);
}
}
但是,一旦我使用map
或filter
等功能方法,它们将再次返回正常的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数组进行子类化呢?
答案 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
。