Zaczynamy pisać polyfill dla funkcji filter. Zakładam, że przerobiliśmy poprzednie lekcje i nie będzie trzeba wszystkiego tłumaczyć. Do dzieła.
Ok, nasz polyfill:
Array.prototype.myFilter = function(callback, thisArg){
var context = thisArg || globalThis;
var arr = [];
for(i=0; i< this.length; i++){
if(callback.call(context, this[i], i, this)){
arr.push(this[i])
}
}
return arr;
}
A teraz użycie:
let arr = [1,2,3];
let filtered = arr.myFilter(function(el){
return el + this.num !== 13;
}, {num: 10});
console.log(filtered.toString());
//1,2
thisArg może sprawiać problemy przy funkcjach strzałkowych:
let arr = [1,2,3];
let filtered = arr.myFilter((el) => el + this.num, {num: 10});
console.log(filtered.toString());
//""
Dzieje się tak, ponieważ funkcja strzałkowa nie może mieć własnego this.
Napiszemy sobie funkcję, która sprawdza, czy podany callback jest strzałkowy czy nie:
function isArrowFunc(func){
return func.toString().includes("=>");
}
console.log(isArrowFunc((el) => el + this.num));
//true
console.log(isArrowFunc(function(el){
return el + this.num;
}));
//false
Dodam, że oryginalna funkcja filter (oraz map) mają te same bolączki – nie można przypisać thisArg do strzałkowej.