Created
March 29, 2025 00:06
-
-
Save ViniciusFXavier/449d84083d11f78d5137ec24b0f52b27 to your computer and use it in GitHub Desktop.
Magic With javascript, all in one variable
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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