O API de proxy JavaScript fornece uma grande quantidade de “mágica” no JavaScript, permitindo que o senhor use qualquer objeto como uma espécie de alias que permite uma parede de validação, formatação e lançamento de erros. O senhor sabia que também pode usar a API de proxy como uma abstração para diferentes tipos de armazenamento? Seja ele sessionStorage, localStorageou IndexedDB, o senhor pode usar um proxy para tornar a API muito mais fácil de trabalhar!

Um uso muito básico do API de proxy é o seguinte:

/*
const proxy = new Proxy({}, {
  get: (obj, prop) => { ... },
  set: (obj, prop, value) => { ... },
  // more props here
});
*/

// This basic proxy returns null instead of undefined if the
// property doesn't exist
const proxy = new Proxy({}, {
  get: (obj, prop) => {
    return prop in obj ? obj[prop] : null;
  }
});

// proxy.whatever => null

O API localStorage é bastante fácil de usar, mas o emprego de um proxy nos permite usar a sintaxe de objeto familiar e, eventualmente, até mesmo trocar o tipo de armazenamento sem que nenhuma outra parte do seu código seja afetada.

function getStorage(storage, prefix) {
  return new Proxy({}, {
    set: (obj, prop, value) => {
      // obj[prop] = value;
      storage.setItem(`${prefix}.${prop}`, value);
    },
    get: (obj, prop) => {
      // return obj[prop];
      return storage.getItem(`${prefix}.${prop}`);
    },
  });
}

// Create an instance of the storage proxy
const userObject = getStorage(localStorage, "user");

// Set a value in localStorage
userObject.name = "David";

// Get the value from localStorage
const { name } = userObject;

Observação: o código acima é um exemplo muito simplista – o senhor também deve adicionar métodos para excluir o objeto, bem como try/catch para evitar erros de armazenamento!

O senhor poderia trocar localStorage por sessionStorage e haveria muito pouco efeito em seu código geral! Se o senhor usa armazenamento em seu aplicativo, provavelmente já está usando uma abstração, mas eu adoro a interação básica com objetos JavaScript.

E não sou o único que adora esse padrão. O depurador DevTools do Firefox usa esse padrão para abstrair a API IndexedDB para armazenar pontos de interrupção, guias e outras preferências!