2012-04-07 17 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 = {} 

Dòng tiếp theo này đã bị hỏng - cách khắc phục?Cách thay thế nguyên mẫu javascript bằng chức năng tùy chỉnh

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

Nó hoạt động tốt cho tôi (trong Firefox). Nó có thể giúp đỡ nếu bạn sẽ giải thích những gì "bị hỏng" có nghĩa là. – Pointy

+1

Đồng ý, nó hoạt động tốt trong Chrome quá: http://jsfiddle.net/4hPhG/ –

+0

Điều duy nhất tôi có thể thấy đó là sai trong mã của bạn là thiếu ';' trên báo cáo đầu tiên. –

Trả lời

16

Vấn đề duy nhất có thể là mã của bạn được thực hiện hai lần, gây ra sự cố: Bản gốc thực .replace sẽ biến mất.

Để tránh các vấn đề như vậy, tôi khuyên các bạn nên thay thế các phương pháp tích hợp trong việc sử dụng các phương pháp chung như sau:

(function(replace) {       // Cache the original method 
    String.prototype.replace = function() { // Redefine the method 
     // Extra function logic here 
     var one_plus_one = 3; 
     // Now, call the original method 
     return replace.apply(this, arguments); 
    }; 
})(String.prototype.replace); 
  • này cho phép nhiều phương pháp sửa đổi mà không phá vỡ chức năng hiện có
  • Bối cảnh là được bảo vệ bởi .apply(): Thông thường, đối tượng this rất quan trọng đối với các phương pháp (nguyên mẫu).
+0

Có thể có các vấn đề khác. Ví dụ (chỉ là giả thuyết) rằng 'replace' là đệ quy và trong một số trường hợp gọi là" chính nó "bằng cách sử dụng' this.replace (...) 'với các tham số khác nhau (ngoại trừ việc nó sẽ không tự gọi nó mà là một phương thức không tương thích khác). Nói chung thay thế một phương pháp được xác định trước với một phương pháp không tương thích sẽ không hoạt động trừ khi bạn cũng biết chính xác phương thức được xác định trước nào gọi. Điều này không khác với việc thay thế một hàm có hàm không tương thích trong thư viện thông thường mà không biết biểu đồ phụ thuộc. – 6502

+0

Điều này hoàn toàn chính xác - tôi đã thực hiện hai lần, vì vậy bản gốc đã bị ghi đè. Lỗi học sinh. Cảm ơn bạn đã trả lời kỹ lưỡng với một số gợi ý hữu ích khác. –

Các vấn đề liên quan