我想用以下方式定义setter和getter:
var myObj = {
// this is the object that should be
// filled with new setters and getters
...
}
/**
* This object contains getters and setters for myObj
*/
var Fields = {
param1: {defaultValue: ..., type: ..., ...}
param2: ...
}
// so the following code doesn't work properly
for (var field in Fields)
Object.__defineGetter__(field, function() {
// do smth
});
此代码导致所有getter都在做同样的事情 (对应于for循环的最后一次迭代)
我应该如何修改代码以使其正常工作?
答案 0 :(得分:4)
以这种方式将for
循环的主体包裹在匿名函数中:
for (var field in Fields){
(function(field){
myObj.__defineGetter__(field, function() {
// do something, pointing to unique variables using "field"
// Example:
doSomethingSpecial(Fields[field].defaultValue);
});
})(field)
}
此方法的效果基于(匿名)函数具有自己的范围的事实。原始变量(字符串,数字)通过值作为参数传递给函数。因此,匿名函数中的field
属性与循环中定义的field
属性不同。
当field
(函数外部)的值发生变化时,函数内的field
变量 不会改变。
我还将Object
替换为myObj
。如果这不正确,请还原更改。
答案 1 :(得分:2)
此功能仅适用于Firefox。
在此链接http://www.codeproject.com/KB/scripting/crossbrowserjavascript.aspx中显示。
“ defineGetter 和 defineSetter 是Mozilla / FireFox的独特功能,您可以通过Google搜索这些关键字,在互联网上找到一些(很少)样本。 “
答案 2 :(得分:1)
var properties = ['asd','asd2','asd3'];
var myob = function(){};
for(var x=0;x<properties.length;x++)
{
var p = properties[x];
var getter = function(){ return this['_' + arguments.callee.propname]; };
getter.propname = p;
myob.prototype.__defineGetter__(p, getter);
var setter = function(value){ this['_' + arguments.callee.propname] = value; };
setter.propname = p;
myob.prototype.__defineSetter__(p, setter);
}
var myobi = new myob();
myobi.asd = 33;
alert(myobi._asd);
alert(myobi.asd);
myobi.asd2 = 44;
alert(myobi._asd2);
alert(myobi.asd2);
HTH!