As you know we can define getters and setters in JS using defineProperty()
. I\'ve been stuck when trying to extend my class using defineProperty()
.
This solution is without extra memory consumption. Your updated code is close. You just need to use this.props[field_name] instead of direct this[field_name].
Please note that defineProperty call replaced to Object.create
Js Fiddle http://jsfiddle.net/amuzalevskyi/65hnpad8/
// util
function createFieldDeclaration(fields) {
var decl = {};
for (var i = 0; i < fields.length; i++) {
(function(fieldName) {
decl[fieldName] = {
get: function () {
return this.props[fieldName];
},
set: function (value) {
this.props[fieldName] = value;
}
}
})(fields[i]);
}
return decl;
}
// class definition
function User(id, name) {
this.props = {};
this.id = id;
this.name = name;
}
User.prototype = Object.create(Object.prototype, createFieldDeclaration(['id','name']));
// tests
var Alex = new User(0, 'Alex'),
Andrey = new User(1, 'Andrey');
document.write(Alex.name + '
'); // Alex
document.write(Andrey.name + '
'); // Andrey
Alex.name = "Alexander";
document.write(Alex.name + '
'); // Alexander
document.write(Andrey.name + '
'); //Andrey