2014-09-27 29 views
-1

簡單地說,爲什麼String.prototype使用標準大括號和鍵值對記錄字符串對象,並且Array.prototype將數組對象記錄爲數組,方括號和值? 爲什麼String.prototype將它的對象記錄爲一個標準對象,而Array.prototype將它的對象記錄爲標準數組?

String.prototype.test = function(){ 
 
    console.log(this); // logs { '0': 't', '1': 'e', '2': 's', '3': 't' } 
 
}; 
 
var str = 'test'; 
 
str.test(); 
 
Array.prototype.test1 = function(){ 
 
    console.log(this); // [1,2,3,4] 
 
}; 
 
var arr = [1,2,3,4]; 
 
arr.test1();

+1

'this'在一個字符串的方法是一個字符串對象。爲什麼會讓你感到驚訝,你可以在字符串對象上調用字符串方法? 'Array'確實遵循相同的模式 - 您可以添加方法並在這些方法中訪問'this'。不知道你在問什麼'Array'。 – jfriend00 2014-09-27 07:01:59

+0

當您在發佈的原型中記錄「this」時,它是一個對象,因爲它具有鍵和值。它令我感到驚訝,因爲如果你嘗試在任何其他類型的對象上調用字符串方法,它將不起作用。我的問題是什麼使一個字符串對象不同於常規對象並且是唯一的? – user2770599 2014-09-27 07:06:56

+0

此外,如果您在數組原型中記錄'this',它將記錄一個數組而不是一個對象..不遵循相同的模式。 – user2770599 2014-09-27 07:07:36

回答

3

因爲在方法調用this參數總是(在稀鬆模式)澆鑄到一個對象。你看到的是一個String對象,它是從"test"原始字符串值產生的。你調用你的方法的數組已經是一個對象,所以什麼也沒有發生,你只是像以前一樣獲得數組。

如果您使用嚴格模式,這個轉換不會發生:

String.prototype.test = function() { 
    "use strict"; 
    console.log(this); 
}; 
var str = 'test'; 
str.test(); // logs "test" 
+0

還值得注意的是,這種情況唯一的其他類型是'Number'。 – slebetman 2014-09-27 15:52:42

+0

另外,感謝您編寫答案。現在我不必:D – slebetman 2014-09-27 15:53:15

+0

是的,這很棒。謝謝! – user2770599 2014-09-27 16:09:21

相關問題