Comment la performance de Voyage-t-il la chaîne prototype est instanceOf code> Fair pour "énormes bibliothèques"?
instanceof code> relativement dénonfomant puis, comparé au stockage d'un numéro d'identification d'interface unique dans la propriété de chaque objet. P> p>
3 Réponses :
Ouais quelque chose comme ça. Voici la partie pertinente du Spécification :
11.8.6 L'instance de l'opérateur strong> p>
La production relationnelexpression em>: relationnelexpression em> instance de stry> shiftexpression em> est évaluée comme suit: p>
- laissez lref em> résultat de l'évaluation de relanceXpression em>. li>
- laisse lval em> getvalue ( lref em>). li>
- laissez rref em> résultat de l'évaluation Shiftexpression em>. li>
- laissez rval em> getvalue ( rref em>). li>
- Si type ( rval em>) n'est pas objet, jetez une exception forte> TypeError forte>. Li>
- si rval em> n'a pas de méthode interne [[hasintstance]], jette une exception
typeError forte>. li> - renvoie le résultat de l'appelant la méthode interne [[Hasinstance]] de rval em> avec argument lval em>. li> ol> blockquote>
où appeler la méthode [[hasinstance]]] em> est définie comme p>
15.3.5.3 [[HASInstance]] (v) strong>
suppose f em> est un objet de fonction. P>
lorsque la méthode interne [[HASINSTIC]] de f em> est appelée de valeur v em>, les étapes suivantes sont prises: p>
- Si v em> n'est pas un objet, retour
faux fort>. li> - laissez o em> résultat de l'appelant la méthode interne [[get]] de f em> avec nom de propriété " prototype fort>". li>
- Si le type ( o em>) n'est pas un objet, lancez une exception forte> TypeError forte>. Li>
- répéter
une. Laissez v em> la valeur de la propriété interne [[prototype]] de v em>.
b. Si v em> estnull fort>, retour faux fort>.
c. Si o em> et v em> reportez-vous au même objet, renvoyez vrai fort>. Li> ol> blockQuote>En ce qui concerne la performance: cela dépend probablement des implémentations réelles dans les navigateurs. Il peut y avoir d'énormes différences entre eux afin que la meilleure chose soit de faire des points de repère, par ex. avec http://jsperf.com/ . p>
Un problème avec
instance de code> Est-ce que cela pourrait ne pas fonctionner si vous l'invoquez sur des éléments de différents contextes, tels qu'un cadre ou une iframe. Par exemple, laisse
A code> être un objet que vous pouvez accéder via
iframe.contentwindow.a code> et que vous souhaitez tester s'il s'agit d'une matrice, puis p>
iframe.contentWindow.a instanceof Array
Ce n'est pas un problème, c'est un avantage énorme! :) Vous pouvez déconner avec iframe.contentwindow.array.pototype code>, puis avoir des tableaux "spéciaux"! Ou
.Object.Prototype code> :)
@Cwolves: qui pourrait avoir un comportement inattendu dans l'iframe. C'est un problème si on ne sait pas à ce sujet.
en V8 (moteur JS de Chrome), il semble y avoir peu de performances de performance:
> var classes = []; > for(var i=0; i<10000; i++){ > classes[i] = function(){}; > i && (classes[i].prototype = new (classes[i-1])()); > } > > var obj0 = new classes[0], > obj9999 = new classes[9999]; > > var start = (+new Date()); for(var i=0; i<10000000; i++){ obj0 instanceof classes[0] } console.log((+new Date()) - start); 138 > var start = (+new Date()); for(var i=0; i<10000000; i++){ obj999 instanceof classes[0] } console.log((+new Date()) - start); 138
passer un peu fou est exactement ce qu'il faut parfois
Selon ce que Felix Kling a cité, tout ce cas d'instanceOf (à l'exclusion des contrôles d'erreur) est de vérifier si la propriété prototype (qui doit être un objet) de la fonction peut être trouvée quelque part sur la chaîne de prototype Voici quelques pseudocodes: P> person instanceof Person
//ROUGHTLY equals
person.instanceOf(Person)
person.instanceOf = function(Person) {
if(typeof Person!='object') throw new TypeError;
if(!([[HasInstance]] in Person)) throw new TypeError;
return Person.[[HasInstance]](this /* person */)
}
Person.[[HasInstance]] = function(V) {
if(typeof V!='object') return false;
var O = this.prototype;
if(typeof O!='object') throw new TypeError;
while(true) {
V = V.__proto__; // [[prototype]] (hidden) property
if(V==null) return false;
if(V==O) return true;
}
}
Connexes: Stackoverflow.com/a/45656957/632951