如何在不重新定义函数的前提下修改其内部的方法或变量
JavaScript修改已定义函数内部挂载方法的实现方案
你可以通过直接覆盖实例属性、劫持原构造函数/方法的方式实现需求,无需重写整个Data的定义,以下是对应不同场景的实现方式:
场景1:修改已创建的单个Data实例的run方法
如果你已经生成了Data实例,且已经调用过实例的same方法完成run方法挂载,直接覆盖实例的run属性即可:
// 已生成的实例 const dataInstance = new Data(); // 调用same完成内部方法挂载 dataInstance.same(); // 直接替换run方法 dataInstance.run = function(n, t) { alert("test ok"); };
该修改仅对当前实例生效,其他新生成的实例不受影响。
场景2:让所有新生成的Data实例默认带修改后的run方法
因为原run方法是在same方法执行时才挂载到实例上,没有挂载在原型链上,我们可以通过劫持原构造函数实现全量修改:
// 保存原始构造函数 const OriginalData = Data; // 重写Data构造函数 Data = function() { // 执行原始构造函数生成实例 const instance = new OriginalData(...arguments); // 劫持实例的same方法 const originalSame = instance.same; instance.same = function(n) { // 执行原same逻辑完成内部方法挂载 const result = originalSame.call(this, n); // 替换run方法 this.run = function(n, t) { alert("test ok"); }; return result; }; return instance; };
后续所有通过new Data()生成的实例,在调用same方法后都会自动使用你修改后的run逻辑。
场景3:Data本身是IIFE返回的单例实例
如果你的IIFE最终返回的是n的实例而非构造函数(单例模式),直接修改这个单例的对应方法即可:
// 先调用same完成挂载 Data.same(); // 直接替换run Data.run = function(n, t) { alert("test ok"); };
内容的提问来源于stack exchange,提问作者Best Friday
相关产品推荐
相关产品推荐

