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

JS类开发疑问:创建House子对象时如何同步更新Street父对象属性?

Street与House类的关联逻辑优化及问题解答

问题1:Street的newHouse方法是否正确?能否在House类实现关联?

  • 原代码中House继承Street是完全错误的:房子与街道是关联关系,而非子类关系(房子不是一种街道),这个继承逻辑违背了面向对象的设计原则。
  • 原newHouse方法仅创建了House实例,但未将实例与当前Street绑定、也未存储实例,逻辑不完整。
  • 可以在House类中实现关联:给House添加attachToStreet方法,或者在Street类中新增addHouse方法来接收已实例化的House对象,完成双向绑定。

问题2:showStreet调用时streetname未显示、totalLength未立即更新

  • streetname未显示:因为错误的继承逻辑,House调用super()时会创建一个无streetname的Street实例,导致House内部的streetname为undefined。
  • totalLength未立即更新:原newHouse方法仅更新了totalLength,但未调用showStreet;且street2.newHouse(250, false)执行后没有主动触发showStreet,所以控制台看不到更新后的值。

问题3:直接实例化House后如何关联到Street?

  • 给Street类添加addHouse方法,接收已创建的House实例,将其存入Street的houses数组,同时更新totalLength。
  • 给House类添加attachToStreet方法,接收Street实例,完成双向绑定(House持有Street引用,Street存储House实例),还可处理房屋从旧街道转移到新街道的逻辑。

优化后的完整代码

class Street {
  constructor(streetname) {
    this.streetname = streetname;
    this.totalLength = 0;
    this.houses = []; // 存储街道上的所有House实例
    this.showStreet();
  }

  showStreet() {
    console.log(`街道名称:${this.streetname}`);
    console.log(`总长度:${this.totalLength}`);
  }

  // 创建并绑定House到当前街道
  newHouse(width, mirrorSide) {
    const house = new House(width, mirrorSide);
    this.addHouse(house);
    return house;
  }

  // 绑定已存在的House到当前街道
  addHouse(house) {
    // 避免重复添加
    if (!this.houses.includes(house)) {
      this.houses.push(house);
      this.totalLength += house.width;
      // 让House持有当前街道的引用
      house.attachToStreet(this);
    }
    // 添加后立即显示街道状态
    this.showStreet();
  }
}

class House {
  static instanceCount = 0;

  constructor(width, mirrorSide) {
    this.width = width;
    this.mirrorSide = mirrorSide;
    this.street = null; // 存储关联的街道
    House.instanceCount++;
    this.showHouse();
  }

  showHouse() {
    console.log("房屋信息:");
    console.log(`宽度:${this.width}`);
    console.log(`是否镜像:${this.mirrorSide}`);
    if (this.street) {
      console.log(`所属街道:${this.street.streetname}`);
    }
  }

  // 将当前房屋绑定到指定街道(支持转移街道)
  attachToStreet(street) {
    // 如果之前有绑定的街道,先从旧街道移除
    if (this.street) {
      const oldIndex = this.street.houses.indexOf(this);
      if (oldIndex !== -1) {
        this.street.houses.splice(oldIndex, 1);
        this.street.totalLength -= this.width;
      }
    }
    this.street = street;
  }
}

// 测试示例
const street1 = new Street("Berenstraat");
const street2 = new Street("Vossenstraat");

// 直接实例化House后关联到街道
const house1 = new House(120, false);
street1.addHouse(house1);

const house2 = new House(90, false);
street2.addHouse(house2);

// 通过街道创建并绑定House
street1.newHouse(200, false);
street1.newHouse(180, false);

street2.newHouse(250, false);

内容的提问来源于stack exchange,提问作者Code-MonKy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 10:03:15