pourquoi Array.prototype.map.call au lieu de Array.map.call
Je suis tombé sur quelques lignes de code où le gars utilise Array.prototype.map.call
au lieu de Array.map.call
:
function getLinks() {
var links = document.querySelectorAll('h3.r a');
return Array.prototype.map.call(links, function(e) {
return e.getAttribute('href');
});
}
Pourquoi ne pas simplement appeler Array.map.call
? J'ai vérifié sur le Firefox de la console et les deux Array
et Array.prototype
ont la fonction map. Est-il une différence ?
source d'informationauteur PerrierCitror | 2013-11-22
Vous devez vous connecter pour publier un commentaire.
C'est parce que
document.querySelectorAll
ne renvoie pas unArray
instance, mais une instance deNodeList
(ou au moins n'est pas garanti de retour d'unArray
sur tous les navigateurs).NodeList
a indexé les éléments mais ne comprend pas toutes les méthodes de laArray
prototype.C'est pourquoi nous avons besoin d'un hack appel
map
méthode deArray
'prototype dans le contexte de l'objet retourné.Je suppose que vous comprenez que pour:
l'expression:
est équivalent à:
Voir aussi:
Parce que
Array.map.call
ne fonctionne pas.Array.map
est construit pour accepter deux paramètres: le tableau, et le rappel.call
exécute une fonction de réglage de sonthis
à l'objet de l'offre.Donc, lorsque vous exécutez
Array.prototype.map.call(somearray,function(){...});
il est pratiquement le même que si vous l'avez appelésomearray.map(function(){...});
.Array.map
est juste une méthode utilitaire Javascript dans Firefox que (une autre raison de ne pas l'utiliser) a pour rendre la vie plus facile. LeArray.map
fonction n'est pas cross-browser.Edit: La raison qu'ils avaient à utiliser
Array.prototype.map.call(links,...);
au lieu de simplementlinks.map(...);
c'est quequerySelectorAll
ne pas retourner un tableau normal, il renvoie uneNodeList
qui n'ont pas demap
méthode.Bonne Question:
Tableau est une fonction constructeur pour créer des tableaux.
Si vous le type de Tableau dans le navigateur de la console, vous obtiendrez une définition de fonction, quelque chose comme
la fonction Array() { [native code] }
Si vous le type de Tableau.prototype dans le navigateur de la console, vous obtiendrez un tableau vide je.e [ ]
c'est à dire un objet de Tableau.
Considérons cet extrait
Lorsque vous tapez
d = new a();
Alors d est un objet possédant les deux propriétés qui sont des fonctions c'est à dire b et c et vous pouvez appeler
>> d.b() //logs b
>> d.c() //logs c
Mais vous ne pouvez pas appeler
a.b() or a.c()
//depuis la fonction b et c n'est pas la propriété d'un.Ainsi, tout comme la fonction b et c sont définis en fonction de un. De même, la fonction de la carte est définie dans la fonction Array.
Si vous ne pouvez pas appeler
Array.map()
mais vous avez pour obtenir un objet de Tableau et de l'appel de fonction map.Array.prototype
nous donne un Tableau d'objetils sont Donc à l'aide de
Array.prototype.map.call(a,func)
Désolé pour la longue explication. Espérons qu'il avantages.:)
map
est destinée à être appelée sur les instances d'array. Ainsi,Array.prototype.map
.Array.map
n'existe pas dans la plupart des navigateurs.Ils ont probablement évité
Array.map
car il n'existe pas dans Chrome ou IE.