Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Composição

boa tarde, estou querendo fazer uns teste para ver se realmente entendi, mas quando eu tento acessar a class Passarinho e acessar voa, no console fala que não reconhece voa

class Aviao {

    constructor(nome) {
        this._nome = nome;
    }

    voa() {
        alert(`${this._nome} está voando`);
    }

    ligaMotor() {
        console.log('liga o motor');
    }

    fechaPortas() {
        console.log('Portas sendo fechadas');
    }
}

class Passarinho {

    constructor(nome) {
        this._nome = nome;
        // guarda uma instância de avião
        this._aviao = new Aviao(nome);
    }

    static voa() {
        // usa o método voa de Aviao
        this._aviao.voa();
    }
}

console.log(Passarinho.voa())
4 respostas

Olá, Leveditor, tudo bem?

O erro ocorre porque o método voa() de Passarinho é estático, ou seja, precisa ser invocado diretamente da classe, assim como você está fazendo no console.log. No entanto, para que ele funcione, ele precisa do atributo this._aviao, e o atributo do avião só recebe um valor quando o constructor é chamado, ou seja, quando é instanciado um novo objeto.

Não utilize métodos estáticos que dependam de preenchimento de valores do construtor. Como o método estático é uma chamada diretamente da classe, ele não pode depender de um valor preenchido no construtor, afinal, o método precisa ser chamado sem a instância de um objeto e o atributo de aviao só será preenchido quando um objeto for instanciado, o que torna o código incompatível.

Espero ter ajudado :)

opa blz, desculpa mas não consegui entender aonde eu coloco o this._aviao

solução!

Tente algo assim

class Aviao {

    constructor(nome) {
        this._nome = nome;
    }

    voa() {
        alert(`${this._nome} está voando`);
    }

    ligaMotor() {
        console.log('liga o motor');
    }

    fechaPortas() {
        console.log('Portas sendo fechadas');
    }
}
class Passarinho {

    constructor(nome) {
        this._nome = nome;
        // guarda uma instância de avião
        this._aviao = new Aviao(nome);
    }

    voa() { //retiramos o método estatico, assim o método será chamado quando a classe for instanciada
        // usa o método voa de Aviao
        this._aviao.voa();
    }
}
//instanciamos o objeto, dessa forma o construtor será chamado e o valor de "aviao" será preenchido dentro dele
var passaro = new Passarinho('andorinha');
//agora que o valor de aviao foi preenchido, podemos chamar o voa, pois ele chama o voa do aviao, e agora temos um aviao
passaro.voa();

funcionou, muito obrigado pela atenção Lucas