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