如何通过引用共享其他对象属性并修改?附代码示例
解决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
相关产品推荐
相关产品推荐

