1
resposta

POR FAVOR, ME RESPONDA

esse codigo abaixo do curso type da monica BYTEBANK:

ta complicado que eu nao entendo o que o this ali embaixo ta fazendo referencia, se é da classe que ele faz parte... se é do objeto que ele vai ser utilizado ou se ele ta fazendo referencia ao objeto que ta sendo pego do local storage... ta muito foda, perdoa o palavrao

export class Armazenador { private constructor(){}

static salvar(chave: string, valor: any): void {
    const valorComoString = JSON.stringify(valor);
    localStorage.setItem(chave, valorComoString)
}
//ESSE THIS AQUI DO REVIVER
static obter(chave: string, reviver?: (this: any, key: string, value: any) => any){
    const valor = localStorage.getItem(chave);

    if(valor === null) {
        return
    }
    if(reviver){
        return JSON.parse(valor,reviver)
    }

    return JSON.parse(valor);
}

}
1 resposta

Oi Marcos, tudo bem?

Nesse caso, o this dentro da função reviver não se refere à classe Armazenador nem ao objeto que está sendo retornado pelo método obter. Ele se refere ao objeto atual sendo transformado pela função reviver.

Quando você chama o método obter e passa uma função reviver como parâmetro, essa função reviver será chamada pelo JSON.parse para cada propriedade do objeto que está sendo recuperado do localStorage.

Então, o this dentro da função reviver se refere ao objeto atual sendo transformado, não à classe Armazenador nem ao objeto retornado pelo método obter.

Isso é uma convenção comum em funções de transformação, como a função reviver, para que você possa acessar o objeto atual sendo transformado dentro da função.

Então, para resumir:

  • O this dentro da função reviver se refere ao objeto atual sendo transformado, não à classe Armazenador nem ao objeto retornado pelo método obter.

  • Isso é uma convenção comum em funções de transformação, para que você possa acessar o objeto atual sendo transformado dentro da função.

Para ilustrar, coloquei alguns comentários no código abaixo para que fique ainda mais claro de entender:

export class Armazenador {
    private constructor() {}

    static salvar(chave: string, valor: any): void {
        const valorComoString = JSON.stringify(valor);
        localStorage.setItem(chave, valorComoString);
    }

    static obter(chave: string, reviver?: (this: any, key: string, value: any) => any) {
        const valor = localStorage.getItem(chave);

        if (valor === null) {
            return;
        }

        if (reviver) {
            return JSON.parse(valor, reviver);
        }

        return JSON.parse(valor);
    }
}

// Objeto exemplo para salvar no localStorage
const exemplo = { nome: "João", idade: 30 };

// Salvando o objeto
Armazenador.salvar('pessoa', exemplo);

// Função reviver
function reviver(this: any, key: string, value: any): any {
    if (key === 'idade') {
        console.log(`Valor de this: ${JSON.stringify(this)}`);  // 'this' aqui se refere ao objeto atual que está sendo transformado, o output aqui seria 'Valor de this: {"nome":"João","idade":30}'
        return value + 1;  // Incrementa a idade em 1
    }
    return value;
}

// Obtendo o objeto do localStorage usando a função reviver
const pessoaComIdadeIncrementada = Armazenador.obter('pessoa', reviver);

console.log(pessoaComIdadeIncrementada);  // Output: { nome: "João", idade: 31 }

Espero ter ajudado. Um grande abraço e até mais!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!