ฉันได้สร้างผู้ช่วยตัวเล็กสำหรับสถานการณ์ที่คล้ายกันเพราะฉันมักจะต้องการแทนที่ฟังก์ชั่นจากห้องสมุดหลายแห่ง ผู้ช่วยนี้ยอมรับ "namespace" (คอนเทนเนอร์ฟังก์ชัน) ชื่อฟังก์ชันและฟังก์ชันแทนที่ มันจะแทนที่ฟังก์ชั่นเดิมใน namespace ที่อ้างถึงด้วยใหม่
ฟังก์ชั่นใหม่ยอมรับฟังก์ชั่นเดิมเป็นอาร์กิวเมนต์แรกและฟังก์ชั่นเดิมข้อโต้แย้งเป็นส่วนที่เหลือ มันจะรักษาบริบททุกครั้ง สนับสนุนฟังก์ชั่นโมฆะและไม่เป็นโมฆะเช่นกัน
function overrideFunction(namespace, baseFuncName, func) {
var originalFn = namespace[baseFuncName];
namespace[baseFuncName] = function () {
return func.apply(this, [originalFn.bind(this)].concat(Array.prototype.slice.call(arguments, 0)));
};
}
ตัวอย่างการใช้ Bootstrap:
overrideFunction($.fn.popover.Constructor.prototype, 'leave', function(baseFn, obj) {
// ... do stuff before base call
baseFn(obj);
// ... do stuff after base call
});
ฉันไม่ได้สร้างการทดสอบประสิทธิภาพใด ๆ มันอาจจะเพิ่มค่าใช้จ่ายที่ไม่พึงประสงค์ซึ่งอาจหรือไม่สามารถเป็นเรื่องใหญ่ขึ้นอยู่กับสถานการณ์