2011-04-28 159 views
2

我在javascript中讀取原型,我寫了2個輸出完全相同的小js代碼。我只是想知道它們之間有什麼區別:Javascript對象原型

代碼1:

String.sam = function() { alert('fine') }; 
'ok'.sam(); 

代碼2原型:

String.prototype.sam = function() { alert('fine') }; 
'ok'.sam(); 

請澄清的差異,更好的辦法使用代碼。

謝謝

回答

4

你的第一個例子不起作用。你在做什麼是創建字符串對象的靜態方法,所以你必須靜態調用它

//OK 
String.sam(); 
//not OK, raises error 
'hello'.sam(); 

在第二個例子中,關鍵字this將把你怎麼稱呼它在弦上的實例。所以你可以做點像

String.prototype.sam = function() { 
    console.log(this.toUpperCase()); 
} 

'hello'.sam(); // HELLO 

這種技術雖然強大,但在某些方面卻令人f目結舌。它被稱爲游擊隊補丁,猴子拳擊或類似的東西。 有它被認爲是不好的幾個原因:

  • 難以調試(你已經改變了語言)
  • 易斷裂是不知道頁面上的其他代碼已經更改了原型
  • 未來核心增強可能會發生衝突。
  • 也許其它更多
+0

自從你提到了所有涉及的陷阱之後,你能否在第二個例子中評論一個更好的選擇?我試圖把我的頭圍繞原型,並且很好奇。 – Chris 2011-05-27 23:17:47

0

我想,你的第一個方法只用於此特殊屬性警報()方法添加。如果你想創建另一個實例,你必須再次做同樣的事情。使用原型可以更一般地定義它,因此您不必爲另一個實例再次執行相同的操作。

也許http://www.javascriptkit.com/javatutors/proto.shtml會幫助你更好地理解它。