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
相关产品推荐
相关产品推荐

