You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重写不可修改代码中的对象方法时,如何调用原方法?

如何在重写的实例方法中调用原方法?

先还原你的场景代码,方便大家理解:

MyObj = new Class.create();
MyObj.prototype = {
    initialize: function () { this.myArg = null; },
    setArg: function(arg) { this.myArg = arg; },
    showArg: function () { alert(this.myArg); }
};
var x = new MyObj();
x.setArg('Something');
x.showArg();
// 现在要重写x的setArg,同时调用原方法
x.setArg = function(arg) {
    //此处如何调用原方法?
    alert('Here is my custom code')
}

核心思路很简单:在重写方法之前,先把原来的方法保存到一个变量里,然后在新方法中调用这个保存的方法,同时注意绑定正确的this指向。

具体实现代码如下:

// 先把原实例的setArg方法存起来
const originalSetArg = x.setArg;

// 重写setArg方法
x.setArg = function(arg) {
    // 调用原方法,用call绑定当前实例的this,确保原方法能正确操作实例属性
    originalSetArg.call(this, arg);
    // 执行你的自定义逻辑
    alert('Here is my custom code');
}

为什么要这么做?

当你直接给x.setArg赋值新函数时,会覆盖这个实例自身的方法(原本它是继承自MyObj.prototype的方法)。提前保存原方法,就能在新逻辑里复用它的功能。

用call(this, arg)是关键:原方法里的this需要指向当前实例x,如果直接调用originalSetArg(arg),this会指向全局对象(非严格模式下)或者undefined(严格模式下),导致this.myArg无法正确赋值。

验证效果

现在调用:

x.setArg('New Value');
x.showArg(); // 会弹出"New Value",说明原方法生效了
// 同时还会弹出你的自定义提示"Here is my custom code"

这样就完美实现了在扩展方法的同时保留原逻辑的需求~

内容的提问来源于stack exchange,提问作者vaso123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:04:33