2010-07-14 88 views
5

也许这个问题很简单,但我现在无法理解。javascript的继承

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

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

如果您知道原因,请告诉我为什么结果是“false”。

回答

8

这是因为当从原始值(如"s")访问属性时,property accesors会在内部强制ToObject,并且比较失败,因为它会检查两个不同的对象引用。

例如:

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

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

这就像比较:

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

为什么第二个例子失败? – 2010-07-14 03:57:46

+2

@Graphain表达式's.self()== s.self()'中,'s'变量中包含的值被强制两次'ToObject',因为's'包含一个原语,当点'.')属性访问器被使用,被强制为能够访问'String.prototype'成员的对象。比较将大致等同于'var s ='s';新的String(s)==新的String(s);'也产生'false'。 – CMS 2010-07-14 03:59:54

+1

@Graphain通俗地说,虽然两个字符串对象都包含相同的数据,但它们是不同的对象,因此==假。 – Stephen 2010-07-14 04:03:59