在JavaScript中,当我创建新的子对象时,如何让父对象的属性更新?
也许我现在已经把大部分事情做好了。
我把房子对象放在父对象里,这样做对吗?用我的 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类。
解决方案
需要改动的地方有几件事:
newHouse方法初始化一个新房子,并递增计数器,但新创建的House对象会被丢弃。- 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。