2010-07-14 137 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