假设class Cheddar
继承自一个将对象作为参数的类;本质上构成:
class Brand {
constructor(b) {
this.brand = b;
}
getBrand() {
return this.brand;
}
}
class Cheese {
constructor(brand_obj) {
// do stuff...
}
}
1
class Cheddar extends Cheese {
constructor(b) {
super(new Brand(b)); // <-- HERE, I'm a "one-liner" kinda guy :D
}
}
现在实例化时:
let snack = new Cheddar("Cabot Clothbound");
我无法访问Brand对象,因为它是作为参数创建的。
因此,我尝试创建Brand并将其放在对象上,然后再调用super,如下所示:
2
class Cheddar extends Cheese {
constructor(b) {
this.brand = new Brand(b);
super(this.brand);
}
}
...导致以下错误:
'this' is not allowed before super()
Grr ..所以,我可以这样:
3
class Cheddar extends Cheese {
constructor(b) {
let myBrand = new Brand(b);
super(myBrand);
this.brand = myBrand;
}
getBrand() {
return this.brand.getBrand();
}
}
现在我可以像这样高兴地访问Cheese对象上的方法:
let snack = new Cheese("Cabot Clothbound");
console.log(snack.getBrand()); //-> Cabot Clothbound
...但是,它变得混乱了。我想成为一个“单线人物”。
以任何方式访问作为此构造函数的参数创建的对象,或者我是否可以将结构简化一些以使其变得更容易?我觉得我在这里太努力了。 Thx,基思:^ D
答案 0 :(得分:1)
您尚未完成Cheese
的构造。如果您想从子类访问// do stuff
,则brand_obj
应该包括保存super(new Brand(b))
。
当您调用class Brand {
constructor(b) {
this.brand = b;
}
getBrand() {
return this.brand;
}
}
class Cheese {
constructor(brand_obj) {
this.brand = brand_obj // <= save this!!
}
}
class Cheddar extends Cheese {
constructor(b) {
super(new Brand(b));
console.log("brand in cheddar constructor", this.brand) //<== now you can use it
}
}
let snack = new Cheddar("Cabot Clothbound");
console.log("Brand on instance: ", snack.brand)
时,品牌对象将最终出现在超类的构造函数中。但是您在那里并没有做任何事情。如果将品牌另存为超类的属性,则该子类将可以使用该
gcloud projects list