в ES6 появится объект Proxy, при помощи которого это можно сделать не зная названий явно. В ES5 же, если рассматривать на вашем примере, можно реализовать так:
function getter (name) {
// ...
return function (value) {
// do something with params
}
}
function setter (name, value) {
// ...
}
['attendee'].forEach(function (name) {
Object.defineProperty(e, name, {
get: bindName(getter),
set: bindName(setter)
});
function bindName (fn) {
return function () {
var args = Array.prototype.slice.call(arguments);
args.unshift(name);
return fn.apply(this, args);
}
}
});