我正在尝试创建一个动态构建自己的getter和setter的对象:
function Person( properties ) { // 'properties' is an object literal
this._private = properties; // private by convention
for ( key in this._private ) {
this[key] = function() {
return this._private[key];
}
}
}
我希望,这会产生类似的结果:
var jack = new Person({
working:true,
age:33,
gender:'male'
});
jack.working() --> true
jack.age() --> 33
jack.gender() --> 'male'
问题是,它总是返回'男性',如下所示:
jack.working() --> 'male'
jack.age() --> 'male'
jack.gender() --> 'male'
我缺少什么?哦,这只是一个概念证明。我知道这不是用JavaScript创建getter和setter的完美解决方案。
答案 0 :(得分:7)
你有一个经典的范围界定问题。创建一个新函数来创建key
的范围:
function Person(properties) { // 'properties' is an object literal
var key;
this._private = properties; // private by convention
this.buildGetter = function (key) {
this[key] = function () {
return this._private[key];
}
};
for (key in this._private) {
this.buildGetter(key);
}
}
答案 1 :(得分:3)
每个人都说eval是邪恶的,但有时却无法避免:
function Person( properties ) { // 'properties' is an object literal
this._private = properties; // private by convention
for ( key in this._private ) {
eval("this[key] = function() { return this._private['"+key.toString()+"'];}");
}
}
jsFiddle:http://jsfiddle.net/pitaj/9sWbe/1/