2012-04-07 22 views
5
// I am trying to make a clone of String's replace function 
// and then re-define the replace function (with a mind to 
// call the original from the new one with some mods) 
String.prototype.replaceOriginal = String.prototype.replace 
String.prototype.replace = {} 

この次の行は現在修正されていますか?javascriptのプロトタイプをカスタム関数に置き換える方法

"lorem ipsum".replaceOriginal(/(orem |um)/g,'') 
+4

それは私のために(Firefoxで)正常に動作します。 「壊れた」という意味を説明すると役に立つかもしれません。 – Pointy

+1

合意、それはクロムでもうまく動作します:http://jsfiddle.net/4hPhG/ –

+0

あなたのコードで間違っていることがわかるのは、最初のステートメントに ';'がないことです。 –

答えて

16

のみ可能問題は、問題の原因となる、あなたのコードが2回実行されていることです。本当のオリジナル.replaceが消えます。このような問題を回避するために

、私は強く内蔵の以下の一般的な方法を用いた方法置き換えることをお勧めします:

​​
  • これは、複数の方法の変更が可能ずにコンテキストがある既存の機能
  • を壊します.apply()で保存:通常、thisオブジェクトは、(プロトタイプ)メソッドにとって不可欠です。
+0

その他の問題があります。たとえば、 'replace'は再帰的であり、場合によっては' this.replace(...) 'を異なるパラメータで呼び出すこともあります(ただし、それ自体は呼び出しませんが、別の互換性のないメソッドはありません)。一般に、あらかじめ定義されたメソッドを互換性のないものに置き換えることは、あらかじめ定義されているメソッド呼び出しを正確に知っていない限り機能しません。これは、依存グラフを知らなくても、標準ライブラリ内の互換性のない関数で関数を置き換えるのと同じです。 – 6502

+0

これはまさに正しいことです。私は2回実行していたので、元のファイルは上書きされていました。校長エラー。他の有用な情報源との徹底的な答えをありがとう。 –

関連する問題