2010-07-14 27 views
5

Peut-être que cette question est facile, mais je ne peux pas comprendre maintenant.L'héritage de javascript

String.prototype.self=function() 
{ 
    return this; 
} 
var s="s"; 

alert("s".self()=="s".self()) //false; 
alert(s.self()==s.self()) //false; 

Si vous connaissez la raison, dites-moi pourquoi le résultat est "faux".

Répondre

8

C'est parce que quand une propriété est accessible à partir d'une valeur primitive, comme "s", le property accesors le contraindre interne ToObject, et la comparaison échoue, car il vérifie deux références d'objets différents.

Par exemple:

String.prototype.test = function() { 
    return typeof this; 
} 

"s".test(); // "object" 

Il est comme comparer:

new String("s") == new String("s"); // false 
+0

Pourquoi le second exemple échoué? –

+2

@Graphain dans l'expression 's.self() == s.self()', la valeur contenue dans la variable 's' est contrainte deux fois' ToObject', puisque 's' contient une primitive, quand le point ('.') l'accesseur de propriété est utilisé, est contraint à l'objet pour pouvoir accéder aux membres' String.prototype'. La comparaison serait à peu près équivalente à 'var s = 's'; new String (s) == new Chaîne (s); 'qui donne aussi' false'. – CMS

+1

@Graphain en termes simples, bien que les deux objets chaîne contiennent les mêmes données, ce sont des objets différents, et donc == false. – Stephen