Skip to content

Instantly share code, notes, and snippets.

@ViniciusFXavier
Created March 29, 2025 00:06
Show Gist options
  • Save ViniciusFXavier/449d84083d11f78d5137ec24b0f52b27 to your computer and use it in GitHub Desktop.
Save ViniciusFXavier/449d84083d11f78d5137ec24b0f52b27 to your computer and use it in GitHub Desktop.
Magic With javascript, all in one variable
function callableTarget() {}
const misterio = new Proxy(
callableTarget,
{
apply(target, thisArg, args) {
if (args.length) {
return `Porque me chamou com esses argumentos: ${args}`;
}
return ['a', 'b'];
},
get(target, prop) {
if (prop === "valor") return { nome: 'Vini' };
if (prop === "undefined") return "Opá não existo ?";
if (prop === Symbol.toPrimitive) {
return function(hint) {
if (hint === "number") return 42;
if (hint === "string") return "hello";
return true;
};
}
return target[prop];
},
construct(target, args) {
return {
texto: 'Instância criada! Será mesmo O.O'
};
},
has(target, prop) {
if (prop === "especial") return true;
return false;
},
set(target, prop, value) {
console.log(`Tentando definir ${prop} como ${value}`);
if (prop === "novaProp") {
console.log(`Definindo nova propriedade ${prop}`);
target[prop] = "Não pode me alterar";
return "Não pode me alterar"
}
target[prop] = value;
return true;
},
deleteProperty(target, prop) {
console.log(`Tentando deletar a propriedade ${prop}`);
delete target[prop];
return "tá tentando me deletar ?";
},
ownKeys(target) {
const defaultKeys = Reflect.ownKeys(target);
const customKeys = ["chave1", "chave2", "valor"];
const result = [...new Set([...defaultKeys, ...customKeys])];
return result
},
getOwnPropertyDescriptor(target, prop) {
if (["chave1", "chave2", "valor"].includes(prop)) {
return {
configurable: true,
enumerable: true,
value: this.get(target, prop)
};
}
return Reflect.getOwnPropertyDescriptor(target, prop);
}
}
);
// Resultado
console.log('1', +misterio); // 42
console.log('2', `${misterio}`); // "hello"
console.log('3', misterio ? "sim" : "não"); // "sim"
console.log('4', misterio.valor); // { nome: 'Vini' }
console.log('5', misterio.undefined); // "Opá não existo ?"
console.log('6', misterio()); // ['a', 'b']
console.log('7', misterio(1, 2, 3)); // "Porque me chamou com esses argumentos: 1,2,3"
console.log('8', misterio('aaaaaaa')); // "Porque me chamou com esses argumentos: aaaaaaa"
console.log('9', new misterio('arg1', 'arg2')); // { texto: 'Instância criada! Será mesmo O.O' }
console.log('10', 'especial' in misterio); // true
console.log('11', 'qualquer' in misterio); // false
console.log('13', Object.keys(misterio)); // ["chave1", "chave2", "valor"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment