const api = (() => { let _name = Symbol(); return { set: (obj, value) => obj[_name] = value, get: obj => obj[_name] } })(); const log = text => { let line = document.createElement("div"); line.appendChild(document.createTextNode(text)); document.body.appendChild(line); } let testObj = { visible: true, value: "abc" }; api.set(testObj, "ninja"); log("Accessing the property: " + api.get(testObj)); log("Visible properties: " + Object.keys(testObj)); // Workaround log("Workaround result"); let descriptors = Object.getOwnPropertyDescriptors(testObj); Object.keys(descriptors) .forEach(name => log(`${name}: ${JSON.stringify(descriptors[name])}`));