Вот пример по вашему FooModel из комментария.
var Validations = {
number: function(val) {
return typeof val === 'number';
}
};
function AbstractModel() {
for (var field in this.fields)
Object.defineProperty(this, field, createAccessor(field));
}
function createAccessor(field) {
var private_;
return {
get: function() {
return private_;
},
set: function(value) {
if (Validations[this.fields[field]](value))
private_ = value;
},
enumerable: true,
configurable: true
}
}
// usage
function FooModel() {
AbstractModel.call(this);
}
FooModel.prototype = {
fields: {
age: 'number'
}
};
var foo = new FooModel;
foo.age = 'test1';
console.log('>>', foo.age); // >> undefined
foo.age = 10;
foo.age = 'test2'
console.log('>>', foo.age); // >> 10