Easy and clean way of creating private object methods and properties, making use of Symbols
// Object with private field
function privateProps() {
const priv = Symbol('private prop');
return {
[priv]: {
id: '1111-2222-3333-4444'
},
getSomething() {
return fetch(`http://.../users/${this[priv].id}`);
}
}
}
const obj = privateProps();
obj.getSomething(); // Accesible
obj[priv] // 'undefined' as we don't have access to priv,
// we can't re-create the symbol from outside as it is unique.
Using in a class?
I don't like this pattern that much, but it can be useful in some cases.
There are other ways of accomplishing this, this is just one example.
const MyClass = (() => {
const priv = Symbol('private');
return class {
constructor(name) {
this[priv] = name;
}
getName(){
return this[priv];
}
}
})();
let instance = new MyClass('test');
instance.private; // undefined
instance.priv; // undefined
instance.getName(); // 'test'
Currently there is a proposal for adding private fields to classes, check it out here