【发布时间】:2021-08-12 23:50:32
【问题描述】:
我认为在 javascript 中扩展数组会很有用,可以通过一些自定义方法和业务逻辑来增强它们。 到目前为止,它运行良好,直到我尝试过滤我的实例。
似乎数组filter 方法用一个参数调用我的构造函数(0,如果没有找到)并返回一个新实例。不是我所期望的。
class MyArray extends Array {
constructor(x, y, z) {
super(x, y, z);
// do custom stuff
}
}
let numbers = new MyArray(1, 2, 3);
console.log(numbers.filter((v) => v === 0));
不过,如果我将一些参数传递并传播到一个变量中,一切都会正常进行。
从技术上讲,我认为两者之间没有区别,我不明白!
class MyArray extends Array {
constructor(x, ...args) {
super(x, ...args);;
// do custom stuff
}
}
let numbers = new MyArray(1, 2, 3);
console.log(numbers.filter((v) => v === 0));
- 为什么第一种方法会遇到这个问题?
- 为什么第二种方法没有遇到这种情况?
(扩展数组或其他核心 js 类是不好的做法吗?)
【问题讨论】:
-
这能回答你的问题吗? Ways to extend Array object in javascript
-
可以使用一个参数指定所需长度或多个参数来指定初始数组元素来调用数组构造函数。
filter()正在使用第一种方法创建一个空数组,然后将其推入。 -
我强烈建议不要在 Javascript 中扩展内置对象。您的代码库中的任何其他库都可能因为您劫持默认对象而中断。我还建议使用更适合 Javascript 的纯函数,而不是尝试扩展类。不要试图让数组更智能,尝试在使用数组作为实现细节的函数中编写业务逻辑。
-
@AndyRay OP 是 Array 的子类化,这很好,他们没有在修补原型。
-
或者,如果您希望
filter不构造MyArray,您可以将@@species设置为Array。
标签: javascript arrays inheritance