Skip to content

Instantly share code, notes, and snippets.

@wooglie
Last active October 16, 2022 15:17
Show Gist options
  • Save wooglie/e40203a7e329b0037baf352ce1fce52d to your computer and use it in GitHub Desktop.
Save wooglie/e40203a7e329b0037baf352ce1fce52d to your computer and use it in GitHub Desktop.
Example of decorator use in JavaScript
function log(target, name, descriptor) {
const original = descriptor.value;
if (typeof original === 'function') {
descriptor.value = function(...args) {
console.log(`[${original.name}] Arguments: ${args}`);
try {
const result = original.apply(this, args);
console.log(`[${original.name}] Result: ${result}`);
return result;
} catch (e) {
console.log(`[${original.name}] Error: ${e}`);
throw e;
}
}
}
return descriptor;
}
function logClass(Class) {
console.log(`[${Class.name}] created. Methods:`, Object.getOwnPropertyNames(Class.prototype));
return Class;
}
@logClass
class Example {
@log
sum(a, b) {
return a + b;
}
test(a, b) {
return a + b;
}
}
const e = new Example();
console.log("logged", e.sum(1, 2));
console.log("not logged", e.test(3, 4));
/*
[LOG]: "[Example] created. Methods:", ["constructor", "sum", "test"]
[LOG]: "[sum] Arguments: 1,2"
[LOG]: "[sum] Result: 3"
[LOG]: "logged", 3
[LOG]: "not logged", 7
*/
function readonly(target, name, descriptor) {
descriptor.writable = false;
return descriptor;
}
class Example2 {
a() { }
@readonly
b() { }
}
const e2 = new Example2();
e2.a = () => { };
e2.b = () => { };
/*
[ERR]: Cannot assign to read only property 'b' of object '#<Example2>'
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment