Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro ao criar métodos estáticos

Fazendo alguns testes nos exercícios do curso até aqui, em especial na criação de métodos estáticos, estou encontrando um erro que não localizei o motivo:

Essa é a minha classe NegociacaoController

class NegociacaoController {

    constructor(){

            let $ = document.querySelector.bind(document);

            this._inputData = $('#data');
            this._inputQuantidade =  $('#quantidade');
            this._inputValor = $('#valor');
            this._contador = 0;

    }

    adiciona(event) {

            event.preventDefault();

            console.log(this._inputData.value);
            console.log(this._inputQuantidade.value);
            console.log(this._inputValor.value);

            console.log("RAW DO CAMPO:");
            console.log(this._inputData);            

            console.log(this._inputData.className);
            console.log(this._inputData.id);
            console.log(this._inputData.getAttribute("diogenes"));
            console.log(this._inputData.setAttribute("diogenes","teste2")); //hasAttribute(name) TRUE | FALSE

            /*

            Observe ainda que se inserirmos uma data com caracteres adicionais à esquerda ou à direita,
            o erro não será lançado. Por exemplo, se definirmos a data 30/09/20199, o ano será truncado
            para os primeiros dígitos. Se informarmos ao método a data 130/09/2019, o dia será truncado 
            para os 2 últimos dígitos.

            Para que a validação funcione corretamente, acrescente marcadores na expressão regular para 
            indicar que queremos validar o texto exato, e nenhum caracter a mais:

            */
            if(!/^\d{4}-\d{2}-\d{2}$/.test(this._inputData.value)) throw new Error('Deve estar no formato aaaa-mm-dd');

            // CONVERTER A DATA PARA DIA MÊS ANO
            let data = DateHelper().converterData(new Date(this._inputData.value.split('-')));

            // POPULAR VALORES
            let negociacao = new Negociacao(
                data,
                this._inputQuantidade.value,
                this._inputValor.value
            );

            console.log(negociacao);            

    }    

}

Essa é a minha classe DateHelper.js

class DateHelper {

  constructor() {

    throw new Error('DateHelper não pode ser instanciada');

    }

    static converterData(tempData) {

        return tempData.getDate()
            + '/' + (tempData.getMonth() + 1)
            + '/' + tempData.getFullYear();

    }

  }

Quando eu chamo o método estático com

let data = DateHelper().converterData(new Date(this._inputData.value.split('-')));

O seguinte erro é retornado

Uncaught TypeError: Class constructor DateHelper cannot be invoked without 'new'

Quando eu adiciono o "New":

Uncaught Error: DateHelper não pode ser instanciada (porque meu método é estático)

Dai não entendi o que pode ser, já que o método "static" não precisa do New

Obrigado

1 resposta
solução!

Fala ai Desiree, tudo bem? O problema está na chamada do método estático, mais especificamente nesse trecho de código:

let data = DateHelper().converterData(new Date(this._inputData.value.split('-')));

Repare que você está tentando chamar a DateHelper como se fosse uma função normal, mas, ela é uma classe, então deveria ser invocada com o new na frente:

let data = new DateHelper().converterData(new Date(this._inputData.value.split('-')));

Isso iria responder o erro: Uncaught TypeError: Class constructor DateHelper cannot be invoked without 'new'

Mas, no seu caso, como o método é estático, você não precisa instanciar a classe, simplesmente chame a função pelo NomeDaClasse.NomeDaFunção

let data = DateHelper.converterData(new Date(this._inputData.value.split('-')));

Dessa maneira.

Isso porque funções estáticas são atribuídas à classe e não instancias.

Espero ter ajudado.