Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Object.defineProperty获取/设置闭包_Javascript_Object_Get_Set - Fatal编程技术网

Javascript Object.defineProperty获取/设置闭包

Javascript Object.defineProperty获取/设置闭包,javascript,object,get,set,Javascript,Object,Get,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;

好的,我尝试通过以下方式创建新对象:

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;
        }
    })
}
结果很糟糕:

out = {a:'c', b:'c', c:'c'}
我知道创建此对象的其他方法,例如:

for (var prop in src) {
    (function(prop) {
        Object.defineProperty(out, prop, {
            get: function() {
                return src[prop];
            },
            set: function(val) {
                src[prop] = val;
            }
        })
    })(prop)
}
或:

但我不明白为什么在第一种方法中,字符串参数“prop”将通过链接发送到函数“defineProperty”。请帮我理解这一点。
抱歉,英语不好。

在循环中创建函数时,您会围绕该循环中使用的变量创建一个闭包。在这种情况下,
prop
周围有一个闭包。每个函数(getter)都有一个对
prop
的引用,因此当以后调用它们时(使用getter时),它们使用
prop
中的值,该值恰好是循环中分配的最后一个值


换句话说,由于getter是稍后调用的,因此
prop
中的值是它上次设置的值<另一方面,code>defineProperty,由于没有闭包,因此获取正确的值。它是在调用时使用值调用的,而不是在循环完成后。

回答比我好,这是完整的。我就是找不到我的单词。嗯,如果我定义get函数,如何为src[prop]创建闭包而不是为prop创建闭包?@3y3我想说最好的方法是在
对象上使用
映射
forEach
。键
。对我来说,你的其他方法也不起作用。out始终是一个空对象,即使我尝试分配类似于
out的内容。a=“something”
我找到了一种生成通用setter/getter的方法。
Object.keys(src).map(function(prop){
    Object.defineProperty(out, prop,{
        get: function(){
            return src[prop];
        },
        set: function(val){
            src[prop]=val;
        }
    })
})