Tout d'abord, faites-le simplement :
x.map(function(s) { return s.trim() });
Ensuite, la raison pour laquelle le premier ne fonctionne pas est que la chaîne est passée en argument à la fonction de rappel, pas en tant que contexte. Comme vous ne passez aucun argument à apply
, vous obtenez le même message que celui que vous auriez obtenu avec
var f = String.prototype.trim.apply; f.call();
Maintenant, principalement pour s'amuser, supposons que vous n'êtes pas satisfait du fait que map
utilise la fonction de rappel de cette manière et que vous aimeriez pouvoir passer une fonction en utilisant le contexte, et non l'argument.
Alors vous pourriez faire ceci :
Object.defineProperty(Array.prototype, "maprec", {
value: function(cb){
return this.map(function(v){ return cb.call(v) })
}
});
console.log([' aa ', ' bb '].maprec(String.prototype.trim)); // logs ["aa", "bb"]
J'ai dit "principalement pour s'amuser" car modifier des objets que vous ne possédez pas (ici le prototype de Array) est largement considéré comme une mauvaise pratique. Mais vous pourriez également créer une fonction utilitaire prenant à la fois le tableau et la fonction de rappel en tant qu'arguments.