3y3*_*3y3 5 javascript get object set
好的,我尝试这样创建新对象:
var src = {a:'a', b:'b', c:'c'};
var out = {};
for(var prop in src){
Object.defineProperty(out, prop,{
get: function(){
return src[prop];
},
set: function(val){
src[prop]=val;
}
})
}
Run Code Online (Sandbox Code Playgroud)
并得到一个糟糕的结果:
out = {a:'c', b:'c', c:'c'}
Run Code Online (Sandbox Code Playgroud)
我知道创建这个对象的其他方法,例如:
for (var prop in src) {
(function(prop) {
Object.defineProperty(out, prop, {
get: function() {
return src[prop];
},
set: function(val) {
src[prop] = val;
}
})
})(prop)
}
Run Code Online (Sandbox Code Playgroud)
或者:
Object.keys(src).map(function(prop){
Object.defineProperty(out, prop,{
get: function(){
return src[prop];
},
set: function(val){
src[prop]=val;
}
})
})
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么在第一种方法中,字符串参数“prop”将通过链接发送到函数“defineProperty”。请帮助我理解这一点。抱歉英语不好。
当您在循环内创建函数时,您会围绕该循环中使用的变量创建一个闭包。在这种情况下, 周围有一个封闭prop。每个函数(getter)都有一个引用,因此prop当稍后调用它们时(使用 getter 时),它们使用的值prop恰好是循环中分配的最后一个值。
换句话说,由于 getter 是稍后调用的,所以 in 的值prop就是它最后设置的值。defineProperty另一方面,由于没有闭包,因此获得了正确的值。它是用调用时的值而不是循环完成后调用的。