Skip to content

Instantly share code, notes, and snippets.

@zazaulola
Last active June 28, 2022 21:10
Show Gist options
  • Save zazaulola/92246783fc099cdd8e69229ea5fd9207 to your computer and use it in GitHub Desktop.
Save zazaulola/92246783fc099cdd8e69229ea5fd9207 to your computer and use it in GitHub Desktop.
Javascript Proxy template
const proxify = object =>
!['function', 'object'].includes(typeof object)
? object
: new Proxy(object, {
/* A trap for a function call */
apply(target, thisArg, args) {
console.log('--- apply() ---');
console.dir(object);
console.log('target:');
console.dir(target);
console.log('thisArg:');
console.dir(thisArg);
console.log('args:');
console.dir(args);
return Reflect.apply(target, thisArg, args);
},
/* A trap for the `new` operator */
construct(target, args) {
console.log('--- construct() ---');
console.dir(object);
console.log('target:');
console.dir(target);
console.log('args:');
console.dir(args);
return proxify(Reflect.construct(target, args));
},
/* A trap for `Object.getOwnPropertyNames` and `Object.getOwnPropertySymbols` */
ownKeys(target) {
console.log('--- ownKeys() ---');
console.dir(object);
console.log('target:');
console.dir(target);
return proxify(Reflect.ownKeys(target));
},
/* A trap for `Object.defineProperty` */
defineProperty(target, key, descriptor) {
console.log('--- defineProperty() ---');
console.dir(object);
console.log('target:');
console.dir(target);
console.log('key:');
console.dir(key);
console.log('descriptor:');
console.dir(descriptor);
return Reflect.defineProperty(target, key, descriptor);
},
/* A trap for the `delete` operator */
deleteProperty(target, prop) {
console.log('--- deleteProperty() ---');
console.dir(object);
console.log('target:');
console.dir(target);
console.log('prop:');
console.dir(prop);
return Reflect.delete(target, prop);
},
/* A trap for getting property values */
get(target, prop, receiver) {
console.log('--- get() ---');
console.dir(object);
console.log('target:');
console.dir(target);
console.log('prop:');
console.dir(prop);
console.log('receiver:');
console.dir(receiver);
return proxify(Reflect.get(target, prop, receiver));
},
/* A trap for setting property values */
set(obj, prop, value) {
console.log('--- set() ---');
console.dir(object);
console.log('target:');
console.dir(target);
console.log('prop:');
console.dir(prop);
console.log('value:');
console.dir(value);
return Reflect.set(obj, prop, value);
},
/* A trap for the `in` operator.*/
has(target, key) {
console.log('--- has() ---');
console.dir(object);
console.log('target:');
console.dir(target);
console.log('key:');
console.dir(key);
return Reflect.has(target, key);
},
/* A trap for `Object.getOwnPropertyDescriptor` */
getOwnPropertyDescriptor(target, prop) {
console.log('--- getOwnPropertyDescriptor() ---');
console.dir(object);
console.log('target:');
console.dir(target);
console.log('prop:');
console.dir(prop);
return proxify(Reflect.getOwnPropertyDescriptor(target, prop));
},
/* A trap for `Object.getPrototypeOf` */
getPrototypeOf(target) {
console.log('--- getPrototypeOf() ---');
console.dir(object);
console.log('target:');
console.dir(target);
return proxify(Reflect.getPrototypeOf(target));
},
/* A trap for `Object.isExtensible` */
isExtensible(target) {
console.log('--- isExtensible() ---');
console.dir(object);
console.log('target:');
console.dir(target);
return Reflect.isExtensible(target);
},
/* A trap for Object.preventExtensions */
preventExtensions(target) {
console.log('--- preventExtensions() ---');
console.dir(object);
console.log('target:');
console.dir(target);
return Reflect.preventExtensions(target);
},
/* A trap for `Object.setPrototypeOf` */
setPrototypeOf(target, proto) {
console.log('--- setPrototypeOf() ---');
console.dir(object);
console.log('target:');
console.dir(target);
console.log('proto:');
console.dir(proto);
return Reflect.setPrototypeOf(target, prop);
},
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment