今天遇到一个迷惑的问题,是关于特权方法的,请看下面的代码:
function User(properties){ for (var p in properties){ (function(which){ var py = p; which["get"+py] = function(){ return properties[py]; } which["set"+py] = function(val){ properties.py = val; alert(properties.py);//3. 我检测了这里,输出是louis } })(this); } } var user = new User({name: "Bob", age:44}) user.getname()//1. 输出为"Bob" user.setname("louis")//2. 打算用此方法设置user实例的name属性 user.getname()//4. 结果,输出还是"Bob"
我动态生成了实例的方法,打算是用user.setname("louis")去修改user这个实例的name属性。
在第三步上面一行,我尝试修改代码为which.py = val;还是输出为Bob,想不通为什么
function User(properties) {
for ( var p in properties) {
(function(which) {
var py = p;
which["get" + py] = function() {
alert(properties[py]+"111111111");
return [color=red]properties.py[/color];
}
which["set" + py] = function(val) {
[color=red] properties.py [/color]= val;
alert(properties.py);//3. 我检测了这里,输出是louis
}
})(this);
}
}
var user = new User( {
name : "Bob",
age : 44
})
user.getname()
//1. 输出为"Bob"
user.setname("louis")
//2. 打算用此方法设置user实例的name属性
alert(user.getname()+"5555")//4. 结果,输出还是"Bob"
2个标红色的地方要都是 properties.py 或者都是properties[py]
写法太奇怪了,不清楚你要实现什么功能,不过你代码中的py只取最后一次的p,正确的写法应该是这样
[code="javascript"]
function User(properties){
for (var p in properties){
(function(which, py){
which["get"+py] = function(){
return properties[py];
}
which["set"+py] = function(val){
properties.py = val;
alert(properties.py);//3. 我检测了这里,输出是louis
}
})(this, py);
}
}
[/code]
properties.py = val;
改为
properties[py] = val;