Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从继承的系统数组调用本机函数_Javascript_Typescript - Fatal编程技术网

Javascript 从继承的系统数组调用本机函数

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

我创建了一个名为OrderedArray的新类,它扩展了一个系统数组:

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中不应该起作用。