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

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 由于没有关闭而获得正确的值。它在调用时被调用,而不是在循环完成后调用。

相关推荐

哪些股票明天复牌? 它们的未来走向如何?
365bet官网手机版

哪些股票明天复牌? 它们的未来走向如何?

📅 01-13 👁️ 8356
中国足球钱景不妙:盈方索赔千万 赞助商欠巨款
365bet官网手机版

中国足球钱景不妙:盈方索赔千万 赞助商欠巨款

📅 07-07 👁️ 7036
笑傲江湖摆摊怎么操作?适合哪些门派?
365提款不到账的吗

笑傲江湖摆摊怎么操作?适合哪些门派?

📅 10-23 👁️ 606