如何访问实例化为参数的对象?

时间:2018-07-20 20:20:35

标签: javascript class ecmascript-6 arguments composition

假设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

1 个答案:

答案 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