2012-04-07 78 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 2012-04-07 20:08:20

+1

一致認爲,它在Chrome中也可以正常工作:http://jsfiddle.net/4hPhG/ – 2012-04-07 20:09:38

+0

我的代碼中唯一可以看到的是錯誤的是第一條語句中缺少';'。 – 2012-04-07 20:10:33

回答

16

唯一可能的問題是,你的代碼被執行了兩次,這會導致問題:真正的原.replace就會消失。

爲了避免這樣的問題,我強烈建議您使用以下的一般方法,以取代內置的方法:

​​
  • 這允許多個方法修改破壞現有的功能
  • 的背景是通過.apply()保存:通常,對象(原型)方法至關重要。
+0

可能還有其他問題。例如(假設)'replace'是遞歸的,在某些情況下,使用帶有不同參數的this.replace(...)'調用「自身」(除了不會調用它自己,而是另一個不兼容的方法)。一般情況下,用不兼容的方法替換預定義的方法是行不通的,除非你也確切地知道哪個預定義的方法調用哪個方法。這與在不知道依賴關係圖的情況下用普通庫中的不兼容函數替換函數沒有區別。 – 6502 2012-04-07 20:24:34

+0

這是完全正確的 - 我執行了兩次,原來被覆蓋。小學生錯誤。感謝與其他一些有用的指針徹底的答案。 – 2012-04-07 20:59:38