Javascript 如何使从数组扩展的类上的工作筛选器函数

Javascript 如何使从数组扩展的类上的工作筛选器函数,javascript,Javascript,我尝试通过扩展泛型数组类来创建自定义数组类。在这个类上,我想创建一个自定义查找/过滤器。当我调用自定义find时,它工作得很好,但是当我调用过滤器时,迭代器出现了问题。 这是我的密码 class MyClass extends Array { constructor(inArray){ super(); this.push(...inArray); } myFind(callback) { return this.find(callback); }

我尝试通过扩展泛型数组类来创建自定义数组类。在这个类上,我想创建一个自定义查找/过滤器。当我调用自定义
find
时,它工作得很好,但是当我调用
过滤器时,迭代器出现了问题。
这是我的密码

class MyClass extends Array {
  constructor(inArray){
    super();
    this.push(...inArray);
  }

  myFind(callback) {
    return this.find(callback);
  }

  myFilter(callback) {
    return this.filter(callback);
  }
}
//Works
console.log(new MyClass(["a","b"]).myFind(item => item === "a"));
//Do not work
console.log(new MyClass(["a","b"]).myFilter(item => item === "a"));

尝试添加:

class MyClass extends Array {
  constructor(inArray){
    super();
    if(inArray !== 0 ) this.push(...inArray); // Condition
  }

  myFind(callback) {
    return this.find(callback);
  }

  myFilter(callback) {
    return this.filter(callback);
  }
}
问题是覆盖数组类是非常危险的 构造函数中,
过滤器的功能是创建一个空
数组,然后用找到的匹配项填充它,所以在创建
空数组
inArray===0
,这会导致
this.push(…inArray)
给出一个 错误


尝试添加:

class MyClass extends Array {
  constructor(inArray){
    super();
    if(inArray !== 0 ) this.push(...inArray); // Condition
  }

  myFind(callback) {
    return this.find(callback);
  }

  myFilter(callback) {
    return this.filter(callback);
  }
}
问题是覆盖数组类是非常危险的 构造函数中,
过滤器的功能是创建一个空
数组,然后用找到的匹配项填充它,所以在创建
空数组
inArray===0
,这会导致
this.push(…inArray)
给出一个 错误


区别在于,
.filter(…)
创建了一个新数组。该数组非常特殊,因为它与调用它的数组具有相同的类型:

 (new MyClass(["a", "b"])).filter(/*...*/) // MyClass(...)
因此,当您调用
过滤器时,它会通过首先传递数组长度来调用数组构造函数:

 Array.prototype.filter = function(cb) {
  const result = new this.constructor(0); // <---
  for(const el of this) 
    if(cb(el) result.push(el);
  return result;
};

而且传播
0
是不可能的。要解决这个问题,请使构造函数的行为与数组构造函数一样,或者不要添加自己的构造函数。

区别在于,
.filter(…)
创建一个新数组。该数组非常特殊,因为它与调用它的数组具有相同的类型:

 (new MyClass(["a", "b"])).filter(/*...*/) // MyClass(...)
因此,当您调用
过滤器时,它会通过首先传递数组长度来调用数组构造函数:

 Array.prototype.filter = function(cb) {
  const result = new this.constructor(0); // <---
  for(const el of this) 
    if(cb(el) result.push(el);
  return result;
};

而且传播
0
是不可能的。要解决这个问题,请使构造函数的行为与数组构造函数一样,或者不要添加自己的构造函数。

可能重复No,因为我的类扩展了
Array
。此行为是由于
新的This.constructor(0)在过滤器原型中调用为@javimovi和@Jonas Wilms,如下所述。可能重复No,因为我的类扩展了
数组
。此行为是由于
新的This.constructor(0)在过滤器原型中被称为@javimovi和@Jonas Wilms,解释如下。