2010-07-14 7 views
5

Vielleicht ist diese Frage einfach, aber ich kann jetzt nicht verstehen.Die Vererbung von Javascript

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

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

Wenn Sie den Grund wissen, bitte sagen Sie mir, warum das Ergebnis "falsch" ist.

Antwort

8

Das ist, weil, wenn eine Eigenschaft von einem Grundwert zugegriffen wird, wie "s", die property accesors es ToObject intern zwingen, und der Vergleich fehlschlägt, weil es zwei Referenzen andere Objekt überprüft.

Zum Beispiel:

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

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

Es ist wie zu vergleichen:

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

Warum das zweite Beispiel fehlschlagen? –

+2

@Graphain im Ausdruck 's.self() == s.self()', wird der in der 's'-Variable enthaltene Wert zweimal um' ToObject' erzwungen, da 's' ein Primitiv hält, wenn der Punkt ('.') property accessor verwendet wird, wird zum Objekt gezwungen, um auf die' String.prototype'-Member zugreifen zu können. Der Vergleich wäre in etwa äquivalent zu 'var s =' s '; new String (s) == new String (s); 'was auch' false' ergibt. – CMS

+1

@Graphain in Layman Bedingungen, obwohl beide String-Objekte die gleichen Daten enthalten, sind sie verschiedene Objekte und somit == false. – Stephen

Verwandte Themen