Javascript 从继承的系统数组调用本机函数
我创建了一个名为OrderedArray的新类,它扩展了一个系统数组:Javascript 从继承的系统数组调用本机函数,javascript,typescript,Javascript,Typescript,我创建了一个名为OrderedArray的新类,它扩展了一个系统数组: export class OrderedArray<T> extends Array<T> { /* istanbul ignore next */ constructor(elements: T[], private _comparer: (a: T, b: T) => number) { super(...elements); Object.s
export class OrderedArray<T> extends Array<T> {
/* istanbul ignore next */
constructor(elements: T[], private _comparer: (a: T, b: T) => number) {
super(...elements);
Object.setPrototypeOf(this, OrderedArray.prototype);
this.sort(this._comparer);
}
/**
* Performs a subsequent ordering of the elements in a sequence in ascending order according to a key.
* @override
*/
public thenBy(keySelector: (key: T) => any): OrderedArray<T> {
return new OrderedArray(
this,
composeComparers(this._comparer, keyComparer(keySelector, false))
);
}
/**
* Performs a subsequent ordering of the elements in a sequence in descending order, according to a key.
* @override
*/
public thenByDescending(keySelector: (key: T) => any): OrderedArray<T> {
return new OrderedArray(
this,
composeComparers(this._comparer, keyComparer(keySelector, true))
);
}
/**
* Converts the OrderedList back to an array to be able to chain other actions to.
*/
public toArray(): T[] {
let returnArray = new Array();
returnArray.addRange(this);
return returnArray;
}
}
这允许我做:array.orderBy(m=>m.field),然后是by(m=>m.field2)代码>
这将返回一个orderedaray
对象,该对象在控制台中如下所示:
它看起来像一个数组,甚至是原型,但是当调用本机数组函数(如slice
)时,会发生以下错误:
未捕获类型错误:对非对象调用CreateListFromArrayLike
现在,我必须在上次orderBy函数调用之后调用toArray()
,将其转换为正确的数组,但这是必要的吗?有没有办法在我的对象上调用本机数组函数?如果这是typescript,请向我们展示它传输到的代码(可能还有typescript配置)。它应该在本机ES6中工作,而不应该在其他环境中工作Object.setPrototypeOf(这是OrderedArray.prototype)代码>看起来非常粗略。哦,实际上它也不应该在ES6中工作,当子类化数组时,这是必须的。错误消息(“length,a number,is not iterable/spreadable”)甚至比旧问题中的更奇特:-)您可以在类上定义@@species
属性,如下所示:static get[Symbol.species](){return Array;}
请参见。我认为这可能是个骗局。@Bergi你说这不应该起作用是什么意思?我现在在生产中使用它,没有任何问题,我在我的帖子中添加了ES5传输代码。@RogerFar我的意思是,鉴于您编写构造函数的方式,调用本机数组方法(实例化另一个数组)在ES6中不应该起作用。