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,解释如下。