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

如何在嵌套对象的函数中修改外部父对象的属性值?

解决嵌套对象函数修改外层对象属性的问题

核心问题是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:02:43