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

非继承方式实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:57:03