const api = (() => { let _name = `__hidden__${new Date().getTime()}`; return { set: (obj, value) => !obj.hasOwnProperty(_name) ? Object.defineProperty(obj, _name, { value: value, writable: true, enumerable: false, configurable: false }) : 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])}`));