Skip to content

Latest commit

 

History

History
27 lines (26 loc) · 1.14 KB

13 Metaprogramming in JavaScript.md

File metadata and controls

27 lines (26 loc) · 1.14 KB

Metaprogramming in JavaScript

Mikael Brevik (@mikaelbrevik)

  • meta == self-referential/reflexive ("about itself")
  • eval("Math.pow(5, 2)") is metaprogramming (because we write a program that writes a program)
  • examining properties of objects at runtime (Object.keys()) is metaprogramming
  • defining new properties of objects at runtime (Object.defineProperty()) is metaprogramming
  • change operations on properties of objects at runtime (javascript proxies) is metaprogramming
  • use cases for a proxy
    • tracing/logging/debugging
function traced(obj) {
	return new Proxy(obj, {
		get (target, prop) {
			let result = Reflect.get(target, prop);
			console.log(`get ${prop} as ${result}`);
			return result;
		}
	})
}
- counting method accesses
- flexible array accessors (negative indices, index ranges, ...)
- auto-creating apis (based on function names, e.g. `div8`, `pow3`)
- developer-friendly apis (meaningful error messages based on levenshtein distance, e.g. `".dib" does not exist. did you mean ".div"?`)
- custom syntax/clojures multi-method