2010-11-10 75 views
5

即使我已經閱讀了很多關於它的文章,但我無法理解原型概念。Javascript中的原型

爲什麼會出現StringString.prototype

如果我有"cat"

  • 那是一個StringObject
  • 它是否繼承StringString.prototype的所有屬性/方法?
  • 爲什麼會出現StringString.prototype
  • 我應該調用String的String對象和String.prototype的String原型嗎?

請澄清這一點。

回答

10

我回答這個問題,因爲有誤傳的主題很多

是這樣一個字符串或一個對象?

沒有"cat"原始字符串值

typeof "cat"; // "string", a String value 
"cat" instanceof String; // false 


typeof new String("cat"); // "object", a String object 
new String("cat") instanceof String; // true 

稍後我會談論類型和原始值。

它是繼承String還是String.prototype的所有屬性/方法?

那麼,當您使用property accessor operator(圓點或括號符號),原始值被隱式轉換爲對象,在內部,因此,所有的上String.prototype的方法是可用的,例如:

當您可以訪問:

"cat".chatAt(0); 

場景"cat"轉換爲對象後面:

Object("cat").chatAt(0); 

這就是爲什麼你有權訪問所有值的繼承屬性。

爲什麼會出現String和String.prototype?

String是一個構造函數,允許你創建String對象或做類型轉換:

var stringObj = new String("foo"); // String object 

// Type conversion 
var myObj = { toString: function() { return "foo!"; } }; 

alert(String(myObj)); // "foo!" 

String.prototype對象,就是String對象實例繼承的對象。

我知道這很讓人困惑,我們有String值和String對象,但是大多數時候你只用字符串值工作,現在不用擔心String對象。

我應該調用String的String對象和String.prototype的String原型嗎?

您應該致電String"The String constructor"

「String prototype」沒問題。

你應該知道「一切都是不是一個對象」。

講起類型,有五個language types規定:

  • 字符串
  • 布爾
  • 未定義

A primitive value是「直接在語言實現的最低級別表示的數據」,這是您可以獲得的最簡單的信息。

先前描述的類型的值可以是:

  • 空:該值null
  • 未定義:值undefined
  • 數字:所有數字,如0,3.1416,1000等。還有NaNInfinity
  • 布爾值:值truefalse
  • 字符串:每個字符串,如"cat""bar"
+0

我同意你與「字符串」和新的String()的區別,我承認我不知道這一點。但我不同意數據和對象的部分。也許字符串,布爾值和數字不是對象,但它們被表示爲JS中的對象,並且如果您執行類似於String instanceof Object的操作,則結果爲true。 – mck89 2010-11-10 09:03:18

+0

@ mck89,我的意思是一個原始值是最簡單的數據片段,是的,你可以「將它們當作對象」(例如,訪問繼承的屬性,''foo「.chatAt'或'5 .. toFixed'),但它們仍然只是那個值,而不是對象。關於'String instanceof Object'很明顯,因爲'String'是一個Function對象*,它繼承自'Function.prototype',它繼承自'Object.prototype',因此'String instanceof Function'也會給你'true '。 – CMS 2010-11-10 09:18:13

3

字符串是JavaScript中的對象。沒有像PHP,C或其他語言那樣的稱爲字符串的真正的數據類型。

String.prototype是一個構造函數,用於爲所有String對象添加功能。如果你希望所有字符串提供例如轉換功能,你做到以下幾點:

String.prototype.convert = function() { 
    // Put your code in here 
} 

// Set up y new String 
var example = "cat"; 

// Now you can call your function 
example.convert(); 
+1

這是不對的,JavaScript有一個String類型,''cat''是一個[**原始值**](http://bclary.com/2004/11/07/#a-4.3。 2)。 JavaScript也可以有* String對象*,但概念不同,它們只是簡單的包裝原語,例如'alert(typeof「foo」); //「string」','alert(typeof Object(「cat」))//「object」'。檢查[我的答案](http://stackoverflow.com/questions/4142230/prototypes-in-javascript/4142624#4142624)。 – CMS 2010-11-10 08:58:12