JSFiddle - React, Tailwind, and code Playground
JavaScript
var fields = ["id", "nam", "last_login"];
var User = (function () {
function User (id, nam) {
Object.defineProperty (this, '__', // Define property for field values
{ value: {} });
for (var p in fields)
this.__[fields[p]] = undefined;
this.id = id;
this.nam = nam;
};
(function define_fields (fields){
fields.forEach (function (field_name) {
Object.defineProperty (User.prototype, field_name, {
get: function () { return this.__ [field_name]; },
set: function (new_value) {
// some business logic goes here
this.__[field_name] = new_value;
}
})
})
}) (fields);
return User;
}) ();
var user1 = new User(1, "Thomas");
var user2 = new User(2, "John");
document.write ('user2: ' + user2.id + ' ' + user2.nam + '<br/>'); // 2, John
document.write ('user1: ' + user1.id + ' ' + user1.nam + '<br/>'); // 2, John
document.write ('user1.__: ' + JSON.stringify (user1.__) + '<br/>');
user1.__ = 123;
document.write ('user1.__: ' + JSON.stringify (user1.__) + ' Not changed !! <br/>');
document.write ('Side effect that properties are not discoverable : <br/>');
document.write (' user1 keys : ' + Object.keys (user1).join (', ') + '<br/>');
document.write (' For in enumeration: <br/>');
for (var p in user1) document.write ('  ' + p + ' : ' + user1[p] + '<br/>')
document.write ('Properties CAN be found using the hidden __ : <br/>');
document.write (' ' + JSON.stringify (user1.__) + '<br/>');
document.write (' user1.__ keys : ' + Object.keys (user1.__).join (', ') + '<br/>');
Object.keys(user1.__).forEach (function (v) {
document.write ('  ' + v + ' : ' + user1[v] + '<br/>'); });