在JavaScript中,当我创建新的子对象时,如何让父对象的属性更新?

前端开发 2026-07-08

也许我现在已经把大部分事情做好了。

我把房子对象放在父对象里,这样做对吗?用我的 newHouse() 函数在 Street 类里?还有其他办法吗,比如在 House 类里,还是只能这样做?

我应该继续这样做吗?在从 newHouse() 执行 this.showStreet() 时,似乎有点问题:没有显示 streetname,也没有立即更新 totalLength

class Street {

  constructor(streetname) {
    this.streetname = streetname;
    this.totalLength = 0;
    this.showStreet();
  }
  showStreet() {
    console.log(this.streetname);
    console.log(this.totalLength);
  }
  newHouse(width, mirrorSide) {
    new House(width, mirrorSide);
    this.totalLength += width;
  }
}
class House extends Street {
  static instanceCount = 0;

  constructor(width, mirrorSide) {
    super();
    this.width = width;
    this.mirrorSide = mirrorSide;
    House.instanceCount++;
    this.showHouse();
  }
  showHouse() {
    console.log("Huis:");
    console.log(this.width);
    console.log(this.mirrorSide);
  }
}

const street1 = new Street("Berenstraat");
const street2 = new Street("Vossenstraat");

const house1 = new House(120, false);
const house2 = new House(90, false);
const house3 = new House(150, false);
// but is this the best way to add it to a street?

street1.newHouse(200, false);
street1.newHouse(180, false);
street1.showStreet();
street2.newHouse(250, false); // Why doesn't it add to "Vossenstraat" immediatly in the console.log?

这是一个Three.js项目:https://codepen.io/michielschukking/pen/JobYBao?editors=0011。我希望最终不需要再像这样写这么多代码。这是我第一次使用JS类。

解决方案

需要改动的地方有几件事:

  1. newHouse 方法初始化一个新房子,并递增计数器,但新创建的House对象会被丢弃。
  2. House继承自Street,但这在判断是否应该使用继承时会违反“is-a”测试。想象这句话:“A House is a Street.” 这在逻辑上有意义吗?房子真的算是街道吗?不是。继承并不是实现你想要的方式。

修复#1之前需要先修复#2。

房子不是Street,但你可以说“Street has many houses.”。“has many” 部分表明你应该使用对象组合(object composition)。与其让Street负责创建新房子,不如把创建房子的职责交给别人,并在 Street 上暴露一个 addHouse 方法:

var street = new Street("Hemming Way");

street.addHouse(new House(100, false));
street.addHouse(new House(58, true));
street.addHouse(...);

现在House可以成为一个独立的类;它不需要从任何东西继承。

在内部,Street类应该有一个由 addHouse 填充的房子列表:

class Street {
  constructor(streetname) {
    this.streetname = streetname;
    this.totalLength = 0;
    this.houses = [];
    this.showStreet();
  }
  showStreet() {
    console.log(this.streetname);
    console.log(this.totalLength);
  }
  addHouse(house) {
    this.houses.push(house);
    this.totalLength += house.width;
  }
}

如果你真的需要一个循环关系(应尽量避免),那么让 addHouse 方法设置street:

  addHouse(house) {
    this.houses.push(house);
    house.street = this;
    this.totalLength += house.width;
  }
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章