2010-07-14 24 views
5

Tal vez esta pregunta es fácil, pero no puedo entender ahora.La herencia de javascript

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

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

Si conoce la razón, dígame por qué el resultado es "falso".

Respuesta

8

Eso es porque cuando una propiedad se accede desde un valor primitivo, como "s", la property accesors coaccionar internamente ToObject, y la comparación falla porque comprueba dos referencias a objetos diferentes.

Por ejemplo:

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

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

Es como comparar:

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

¿Por qué fracasa el segundo ejemplo? –

+2

@Graphain en la expresión 's.self() == s.self()', el valor contenido en la variable 's' se coacciona dos veces' ToObject', ya que 's' contiene una primitiva, cuando el punto ('.') se usa el acceso a la propiedad, se lo coacciona para objetar por poder acceder a los miembros' String.prototype'. La comparación sería más o menos equivalente a 'var s = 's'; nuevos String (s) == new String (s); 'que también produce' false'. – CMS

+1

@Graphain en términos sencillos, aunque ambos objetos de cadena contienen los mismos datos, son objetos diferentes, y por lo tanto == falso. – Stephen