Object.defineProperty获取(get)/设置(set)闭包

1,先看以下例子

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;out.b;out.c

out = {a:'c', b:'c', c:'c'}

2,用以下两种方式

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

or:

var src = {a:'a', b:'b', c:'c'};
var out = {};
Object.keys(src).map(function(prop){
    Object.defineProperty(out, prop,{
        get: function(){
            return src[prop];
        },
        set: function(val){
            src[prop]=val;
        }
    })
})

得到如下结果

可以测试 out.a;out.b;out.c

out = {a:'a', b:'b', c:'c'}

解释说明:

当你在一个循环中创建一个函数时,在那个循环中。在这种情况下,围绕 prop 有一个闭包。每个函数(getters)都有一个对 prop 的引用,所以当它们被稍后调用时(当使用getter时),它们使用 prop中的值恰好是在循环中分配的最后一个值。换句话说,由于稍后调用getter,所以 prop 中的值是它最后一次设置的值至。另一方面, defineProperty 由于没有关闭而获得正确的值。它在调用时被调用,而不是在循环完成后调用。

原文地址:https://www.cnblogs.com/qingjiawen/p/13415813.html