重写不可修改代码中的对象方法时,如何调用原方法?
如何在重写的实例方法中调用原方法?
先还原你的场景代码,方便大家理解:
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
相关产品推荐
相关产品推荐

