【问题标题】:Object.defineProperty get/set closureObject.defineProperty 获取/设置闭包
【发布时间】:2012-12-09 13:08:56
【问题描述】:

好的,我尝试用这种方式创建新对象:

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)
}

或:

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

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

【问题讨论】:

  • 对我来说,您的其他方式也行不通。即使我尝试分配 out.a = "something" 之类的东西,out 也始终是一个空对象
  • 我想出了一种制作通用 setter/getter 的方法。 See my answer here.

标签: javascript object get set


【解决方案1】:

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

换句话说,由于 getter 稍后被调用,prop 中的值是它最后设置的任何值。另一方面,defineProperty 得到正确的值,因为没有闭包。它在调用时使用值调用,而不是在循环完成后调用。

【讨论】:

  • 比我回答得更好,这是完整的。我只是找不到我的话。
  • 嗯,如果我定义了get函数,如何为src[prop]创建闭包而不为prop创建闭包?
  • @3y3 我想说最好的方法是在Object.keys 上使用mapforEach
猜你喜欢
  • 2021-10-18
  • 2014-03-12
  • 2013-02-22
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多