如何在嵌套对象的函数中修改外部父对象的属性值?
解决嵌套对象函数修改外层对象属性的问题
核心问题是doThing函数执行时this的指向错误——默认指向调用它的exampleObj,而非part的实例。以下是几种可行的修复方案:
方案1:调用时用call指定this
修改part里的方法,调用action时通过call把当前part实例传入,强制改变this指向:
var doThing = function() { this.x++; } var exampleObj = { action: doThing } function part(x,y,obj) { this.x = x; this.y = y; this.exampleObj = obj; this.runAction = function() { // 用call指定this为当前part实例 this.exampleObj.action.call(this); } } // 测试 const p = new part(10, 20, exampleObj); p.runAction(); console.log(p.x); // 输出11
方案2:绑定action的this指向
在part构造函数中,把exampleObj.action的this永久绑定到当前实例,后续调用无需再指定:
var doThing = function() { this.x++; } var exampleObj = { action: doThing } function part(x,y,obj) { this.x = x; this.y = y; // 复制原对象并绑定action的this为当前part实例 this.exampleObj = { ...obj, action: obj.action.bind(this) }; this.runAction = function() { this.exampleObj.action(); } } // 测试 const p = new part(10, 20, exampleObj); p.runAction(); console.log(p.x); // 输出11
方案3:直接传递实例引用
修改doThing,让它接收实例作为参数,直接通过参数修改属性:
var doThing = function(instance) { instance.x++; } var exampleObj = { action: doThing } function part(x,y,obj) { this.x = x; this.y = y; this.exampleObj = obj; this.runAction = function() { this.exampleObj.action(this); } } // 测试 const p = new part(10, 20, exampleObj); p.runAction(); console.log(p.x); // 输出11
内容的提问来源于stack exchange,提问作者octoCat
相关产品推荐
相关产品推荐

