Skip to content

Instantly share code, notes, and snippets.

@joemaffei
Created May 10, 2022 20:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joemaffei/fd90feef10f1782ad9c5124923d75e01 to your computer and use it in GitHub Desktop.
Save joemaffei/fd90feef10f1782ad9c5124923d75e01 to your computer and use it in GitHub Desktop.
Object with root-level metadata
/**
* Getters and setters are not enumerable and, obviously, neither are private fields.
*/
class MetadataObject extends Object {
#metadata = undefined;
get metadata() { return this.#metadata; }
set metadata(value) { this.#metadata; }
}
var obj = new MetadataObject();
obj.a = 1;
obj.b = 2;
obj.metadata = { test: 123 };
console.log(obj); // { a: 1, b: 2 }
console.log(obj.metadata); // { test: 123 }
console.log(JSON.stringify(obj)); // '{"a":1,"b":2}'
/**
* Simpler implementation using Map
*/
class MetadataObject extends Object {
#metadata = new Map();
get metadata() { return this.#metadata; }
}
var obj = new MetadataObject();
obj.a = 1;
obj.b = 2;
obj.metadata.set('test', 123);
console.log(obj); // { a: 1, b: 2 }
console.log(obj.metadata.get('test')); // 123
console.log(JSON.stringify(obj)); // '{"a":1,"b":2}'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment