Javascript 不使用扩展语法的自定义类扩展数组

Javascript 不使用扩展语法的自定义类扩展数组,javascript,es6-class,spread-syntax,Javascript,Es6 Class,Spread Syntax,几年来,我一直在用JavaScript(,)构建和使用自定义数据分析工具 我最近做的一个更改是使用JavaScript类来扩展本机的数组类型,这样我就可以轻松地在类似数组的对象上调用自定义函数作为方法,而不是将它们作为参数传递到这些函数中,而不会失去使用[]表示法访问元素的能力 为此,我使用了以下代码: class AnalyserRows extends Array { constructor(sourceArray) { super(...sourceArray);

几年来,我一直在用JavaScript(,)构建和使用自定义数据分析工具

我最近做的一个更改是使用JavaScript类来扩展本机的
数组
类型,这样我就可以轻松地在类似数组的对象上调用自定义函数作为方法,而不是将它们作为参数传递到这些函数中,而不会失去使用
[]
表示法访问元素的能力

为此,我使用了以下代码:

class AnalyserRows extends Array {
    constructor(sourceArray) {
        super(...sourceArray);
    }

    // ...
}
这在一段时间内运行良好,但最近我尝试加载一组特别大的数据,结果遇到了一个问题。我试图创建一个包含大约66000个元素的
AnalyserRows
对象,但是Chrome抛出了这个错误:

未捕获范围错误:超过最大调用堆栈大小

在我的搜索中,我找到了这个问题的解释:

spread操作符(和Array.assign)将整个源数组加载到堆栈上,然后将其推送到目标数组上。一旦源阵列超过125052,就会导致堆栈溢出/范围错误

现在我的问题是如何在自定义类的
构造函数中调用
super
,并在不使用扩展运算符的情况下通过源数组的每个元素


可以用这么多元素创建一个
数组
,而不存在任何实际问题,因此我觉得像这样扩展
数组
的类也可以这样做。但是如果不使用spread运算符或做一些其他的更改来阻止我使用一些我一直使用的语法,我就看不出该怎么做。

数组构造函数有两种形式:可以传递所有数组元素,也可以传递数组的大小。您可以尝试使用第二种形式,然后在构造函数中复制数组元素

class AnalyserRows extends Array {
    constructor(sourceArray) {
        super(sourceArray.length);
        for (let i = 0; i < sourceArray.length; i++) {
            this[i] = sourceArray[i];
        }
    }

    // ...
}
类分析器行扩展数组{
构造函数(sourceArray){
super(sourceArray.length);
for(设i=0;i

但是,对于大型阵列来说,这可能非常缓慢。从您给出的引用来看,似乎任何内置快捷方式都会遇到堆栈溢出问题。

您到底是如何调用
AnalyserRows
?顺便说一句,“rows”是一个现有的数组,我这样调用它:
dataConfig.rows=newanalyserrows(rows)它肯定有效。在遇到这个问题之前,我已经使用它很多年了。刚刚检查过,我可以调用常规的
Array
方法,比如
map
reduce
没问题。也许您还定义了
静态[Symbol.species]=Array
?不。我理解,只有当您希望
Array
的本机方法(通常返回新的
Array
,如
map
reduce
)仍然返回
数组时,才有必要这样做。我不想那样。如果你有兴趣看一下代码,我在我的问题中链接到了回购协议。有问题的文件是analyzer.js,带有扩展语法调用,
new AnalyserRows([])。map(x=>x)
确实为我抛出了一个
TypeError:find non callable@@iterator
,就像在链接的问题中一样。使用
super(sourceArray.length)
,它将返回
AnalyserRows[undefined]
(长度为1),因为您正在将
undefined
传递给super调用。不知道为什么你不能复制它?谢谢Barmar,我刚刚试过,它很有效。这是一个非常简单的解决方案,既然你已经提出了,我觉得自己没有想到这一点很傻!看起来用这种方法创建66000个元素的数组只需要2.4毫秒,至少在这个示例数据中是这样,所以我现在不太担心它太慢。