3
respostas

Colocar sem underline e não dar erro

Olhei no fórum e tinha uma dúvida igual a minha. Porém não me satisfez a resposta.

Eu coloquei sem o underline na propriedade para setar o novo valor. No entanto, não tenho método setter lá no meu model de negociação. Como deu certo, mesmo assim?

No meu entendimento, sem o underline a propriedade não existiria e teria que dar erro.

<script>
            let negociacao = new Proxy(new Negociacao(new Date(), 1, 100), {

                set: function(target, prop, value, receiver) {
                    console.log(`valor anterior: ${target[prop]} novo valor: ${value}`);
                    return Reflect.set(target, prop, value, receiver);

                }
            });

            negociacao.quantidade = 40;
            negociacao.valor = 70;


        </script>
3 respostas

Fala ai Robson, tudo bem? Vamos lá:

Eu coloquei sem o underline na propriedade para setar o novo valor. No entanto, não tenho método setter lá no meu model de negociação. Como deu certo, mesmo assim?

Para uma resposta mais precisa eu precisaria ver como está a classe Negociacao sua.

Mas, por padrão, todo atributo de classe implicitamente por baixo dos panos já tem um get e set.

Caso sua classe tenha o atributo this.quantidade e this.valor. Por padrão ele já vai ter o get (para ler) e set (para alterar).

Agora caso a sua classe tenha definido as propriedades como this._quantidade e this_valor ai realmente não faz sentido ter alterado usando this.quantidade e this.valor.

Pois eles não teriam o set padrão.

Espero ter ajudado.

Pois é, meus atributos estão como _quantidade e _valor. Ou seja, realmente pela lógica (no meu entendimento) não haveria como eu setar um atributo quantidade sem o underline.

Meus gets não têm underline, mas são meros getters e não setters.

class Negociacao {

    constructor(data, quantidade, valor) {

        this._data = new Date(data.getTime());
        this._quantidade = quantidade;
        this._valor = valor;
        Object.freeze(this);
    }

    get volume() {

        return this._quantidade * this._valor;
    }

    get data() {

        return new Date(this._data.getTime());
    }

    get quantidade() {

        return this._quantidade;
    }

    get valor() {

        return this._valor;
    }
}

Fala Robson, fiz um teste com seus códigos e os valores da negociacao não são alterados (o que faz sentido):

class Negociacao {
    constructor(data, quantidade, valor) {
        this._data = new Date(data.getTime());
        this._quantidade = quantidade;
        this._valor = valor;
        Object.freeze(this);
    }

    get volume() {
        return this._quantidade * this._valor;
    }

    get data() {
        return new Date(this._data.getTime());
    }

    get quantidade() {
        return this._quantidade;
    }

    get valor() {
        return this._valor;
    }
}

const n1 = new Negociacao(new Date(), 2, 10)

const negociacao = new Proxy(n1, {
    set: function(target, prop, value, receiver) {
        console.log(`valor anterior: ${target[prop]} novo valor: ${value}`);
        return Reflect.set(target, prop, value, receiver);

    }
});

console.log(negociacao.quantidade)
console.log(negociacao.valor)
console.log(negociacao.volume)

negociacao.quantidade = 5;
negociacao.valor = 5;

console.log(negociacao.quantidade)
console.log(negociacao.valor)
console.log(negociacao.volume)

Os logs anteriores e após a nova atribuição logam os mesmos valores.

Espero ter ajudado.