2011-04-28 10 views
2

私はjavascriptのプロトタイプを読んでいましたが、まったく同じものを出力している2つの小さなjsコードを書いています。私はそれらの間の差であるかを知りたい:Javascript Object Prototype

コード1:プロトタイプを持つ

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

コード2:

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

を差より良い方法を明確にしてくださいコードを使用する。

ありがとうございました

答えて

4

最初の例は機能しません。キーワードthisは、あなたがそれを呼び出す文字列のインスタンスを参照しますあなたの第二の例では

静的

//OK 
String.sam(); 
//not OK, raises error 
'hello'.sam(); 
それを呼び出す必要がありますので、何がやっていることは、文字列オブジェクトの静的メソッドを作成しています。強力は、特定の四半期に眉をひそめているものの、だから、

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

'hello'.sam(); // HELLO 

この技術のような何かを行うことができます。これは、ゲリラパッチ、猿のパンチまたは同様のものとして知られています。 それが悪いと考えられているいくつかの理由があります:

あなたはプロトタイプを変更してある認識していないページ上の他のコードを破る
  • 簡単に(あなたが言語を変更した)デバッグするのは難しい
    • 将来のコアの拡張機能との衝突が考えられます。
    • おそらくもっとたくさん
  • +0

    2つ目の例では、関連するすべての落とし穴を述べたので、より良い選択肢についてコメントしてください。私はプロトタイプの周りに頭を包み込みたいと思っていて、興味があります。 – Chris

    0

    私が思うに、あなたの第一の方法は、この特別なプロパティのためにのみ警告()メソッドを追加します。別のインスタンスを作成したい場合は、同じことをもう一度行う必要があります。プロトタイプでは、より一般的に定義するので、別のインスタンスに対して同じことをやり直す必要はありません。

    おそらくhttp://www.javascriptkit.com/javatutors/proto.shtmlは、あなたがそれをよりよく理解するのに役立ちます。

    関連する問題