A.S.: 因简化起见,变量名称已更改。
我的目标是创建一个新的类似数组的类,每个实例都将基于任何数量的任何参数具有七个数字。
因此,代码类似于以下内容:
"use strict";
class SevenNumbers extends Array {
constructor(...args) { debugger; // !
// Cut the rest; fill the gaps; convert: first to object, then to primitive
super(...Object.assign([0, 0, 0, 0, 0, 0, 0], args.slice(0, 7)).map(arg => +new Number(arg)));
}
}
它运行良好,因此
new SevenNumbers();
返回一个由七个数字组成的数组,可以是默认值(0),也可以不是。debugger
部分很重要:它告诉我们进入了SevenNumbers
类的构造函数。当我尝试对获取的对象进行
map()
时,问题就出现了。
请尝试以下代码:var arr = new SevenNumbers(8, 7, 6, 5, 4, 3, 2, 1);
// SevenNumbers [8, 7, 6, 5, 4, 3, 2] (without the last).
arr.map(_ => _);
// Array [8, 7, 6, 5, 4, 3, 2].
第一部分按照预期工作,但在第三行中我们再次进入构造函数!最令人困惑的是,这里唯一的参数是arr
的长度。为什么是长度?
虽然最终结果是正确的,但这种奇怪的行为干扰了我的实际工作,因为之间还有额外的计算。
这里出了什么问题?为什么不直接从现成的自定义数组中获取值,而要创建一个新的数组?
.map
函数不仅仅是创建一个数组,而是创建其调用者的实例呢?(特别是当该调用者继承自数组时)。 - coyotte508length
属性作为参数呢?这个问题的这一部分是最奇怪的。 - Parzh from Ukrainenew Array(length)
是标准构造函数。 - Bergi+new Number(5)
的微妙之处我错过了。 :-) - RobG