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

如何通过引用共享其他对象属性并修改?附代码示例

解决A实例属性在B实例中同步修改的问题

你当前的问题出在基本类型的值传递特性上:a.a是数字(属于JavaScript基本类型),当你把a.a作为参数传给B的构造函数时,传递的是值的副本,B实例里的this.a和A实例的a.a是完全独立的两个变量,所以修改B的a不会影响A的a.a。

下面是几种可行的解决方案:

方案一:用引用类型包裹目标属性

把需要共享的a属性放在一个对象(或数组)里,因为对象是引用类型,传递的是内存地址的引用,修改对象内部的属性会同步到原实例:

class A {
    constructor() {
        this.shared = { a: 1 } // 用对象包裹需要共享的a
        this.b = 2
    }
}

class B {
    constructor({ shared }) {
        this.shared = shared
    }
    
    addToA() {
        this.shared.a += 1
    }
}

const a = new A()
const b = new B({ shared: a.shared })

b.addToA()
console.log(a.shared.a) // 输出2

方案二:通过访问器函数关联属性

如果不想传递整个对象或实例,可以传递获取和设置A实例a属性的函数,让B通过这些函数间接修改A的属性:

class A {
    constructor() {
        this.a = 1
        this.b = 2
    }
}

class B {
    constructor({ getA, setA }) {
        this.getA = getA
        this.setA = setA
    }
    
    addToA() {
        this.setA(this.getA() + 1)
    }
}

const a = new A()
// 传递获取和设置a.a的函数
const b = new B({ 
    getA: () => a.a, 
    setA: (value) => { a.a = value } 
})

b.addToA()
console.log(a.a) // 输出2

方案三:传递实例并封装访问逻辑(若可接受传递实例)

如果只是不想在B里操作A的其他属性,可以传递A实例,但在B里用getter/setter封装对a属性的访问,避免误改其他属性:

class A {
    constructor() {
        this.a = 1
        this.b = 2
    }
}

class B {
    constructor(aInstance) {
        this._aInstance = aInstance
    }
    
    // 用getter和setter关联到A的a属性
    get a() {
        return this._aInstance.a
    }
    
    set a(value) {
        this._aInstance.a = value
    }
    
    addToA() {
        this.a += 1
    }
}

const a = new A()
const b = new B(a)

b.addToA()
console.log(a.a) // 输出2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:25:32