非继承方式实现Class A与Class B的类变量共享方案咨询
问题描述
有两个类A和B,仅会对class A的变量赋值,希望class B的变量与class A保持一致,或能访问class A的所有变量。从逻辑上class A和B不应存在继承关系,能否在不使用继承的情况下实现?
下方示例代码中仅需共享一个变量,可通过方法参数传递name,但实际项目中有20+个变量,逐个传递过于繁琐。
代码示例:
class B { name: string age: number print() { console.log(this.name); } } const b = new B(); class A { name: string; age: number; printValues() { b.print() } } const a = new A(); a.name = "TOM" a.printValues() // 期望输出 TOM
解决方案
当然可以实现,以下是几种无需继承的可行方案:
方案1:让B持有A的实例引用
直接在B中保存A的实例,B的方法直接访问A的属性,无需额外同步操作,始终能获取A的最新值。
修改后的代码:
class B { private aInstance: A; constructor(a: A) { this.aInstance = a; } print() { console.log(this.aInstance.name); } // 访问其他属性直接通过实例获取 getAge() { return this.aInstance.age; } } class A { name: string; age: number; printValues() { b.print() } } const a = new A(); const b = new B(a); // 初始化时传入A的实例 a.name = "TOM" a.printValues() // 输出 TOM a.age = 20; console.log(b.getAge()); // 输出 20
方案2:使用共享状态对象
将A和B的共同属性抽离到独立的状态对象中,A和B都引用这个对象。修改A的属性本质是修改共享对象的属性,B自然能获取到最新值。
代码示例:
// 定义共享状态类型 interface SharedState { name: string; age: number; // 其他20+个属性 } class B { private state: SharedState; constructor(state: SharedState) { this.state = state; } print() { console.log(this.state.name); } } class A { private state: SharedState; constructor(state: SharedState) { this.state = state; } // 通过访问器封装属性赋值与读取 set name(value: string) { this.state.name = value; } get name() { return this.state.name; } set age(value: number) { this.state.age = value; } get age() { return this.state.age; } printValues() { b.print() } } // 创建共享状态对象 const sharedState: SharedState = { name: "", age: 0 }; const a = new A(sharedState); const b = new B(sharedState); a.name = "TOM" a.printValues() // 输出 TOM a.age = 25; console.log(b.state.age); // 输出 25
方案3:用Proxy自动同步属性
如果需要B自身拥有独立属性,而非引用外部对象,可以使用Proxy监听A的属性变化,自动同步到B中。
代码示例:
class B { name: string = ""; age: number = 0; print() { console.log(this.name); } } class A { name: string = ""; age: number = 0; constructor(private bInstance: B) { // 创建代理监听属性变化 return new Proxy(this, { set(target, prop, value) { // 先设置A自身属性 (target as any)[prop] = value; // 同步到B(仅同步B存在的属性) if (prop in bInstance) { (bInstance as any)[prop] = value; } return true; } }); } printValues() { this.bInstance.print() } } const b = new B(); const a = new A(b); a.name = "TOM" a.printValues() // 输出 TOM a.age = 30; console.log(b.age); // 输出 30
内容的提问来源于stack exchange,提问作者user3083590
相关产品推荐
相关产品推荐

