Object.defineProperty 获取/设置闭包

2023-11-27

好的,我尝试这样创建新对象:

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

or:

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

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


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

换句话说,由于 getter 是稍后调用的,所以中的值prop是它最后设置的值。defineProperty另一方面,由于没有闭包,因此获得了正确的值。它是用调用时的值而不是循环完成后调用的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Object.defineProperty 获取/设置闭包 的相关文章

随机推荐

  • Silverlight:组合框中的默认值

    我想在组合框中显示默认文本 例如 选择一个人 消息 你能帮我一下吗 请注意 我正在使用域上下文中的数据绑定 谢谢 为了实现这一点 我使用了派生的ExtendedComboBox扩展内置类ComboBox班级 您可以在以下位置找到该类的源代码
  • HL7 FHIR 在 asp.net web api 中序列化为 json

    我正在使用 HL7 Fhirnuget由 Ewout Kramer 创建的软件包 0 9 3 我将其与 ASP NET Web API 绑定在一起 但不幸的是内置的 JSON 序列化无法正确生成 JSON 它包含很多这样的内容
  • 现代CPU会跳过零乘法吗?

    我想知道当两个数字中至少有一个为零时 当前的CPU是否避免将两个数字相乘 谢谢 这根据 CPU 和 在某些情况下 操作数的类型而有很大差异 较旧 较简单的 CPU 通常使用如下乘法算法 integer operator integer co
  • 文本溢出时的选取框文本

    这是我的问题 假设我有 3 个 div 标签 宽度均为 100 像素 lt DIV WIDTH gt Text in div 1 Text in div two it overflows Text in div three lt DIV W
  • NumPy 中的加权标准差

    numpy average 有一个权重选项 但是numpy std 才不是 有人对解决方法有建议吗 下面这个简短的 手动计算 怎么样 def weighted avg and std values weights Return the we
  • C中的查找表

    我正在用 C 创建一个查找表 当我定义这个时 typedef struct char action char message lookuptab lookuptab tab aa bb cc dd 它编译时没有错误 但是当我做这样的事情时
  • 如何从回收站恢复文件[重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 C 从回收站恢复文件 有人知道如何使用 C 和 Windows API 从回收站恢复文件吗 This link可以帮你 using System using System Collectio
  • 视差视图滚动(类似雅虎天气)

    严格来说 这不是一个编程问题 而是更多的 如何完成这个 问题 我很好奇 并且正在开发一个可能需要此功能的应用程序 如何实现左右视差滚动 要准确了解我的意思 请查看雅虎天气应用程序 它是免费的 不用担心 他们是只使用一个视图控制器还是为其中显
  • 如何在CSS中制作渐变边框

    我正在尝试将渐变应用于边框 我认为这就像这样做一样简单 border color moz linear gradient top 555555 111111 但这是行不通的 有谁知道边框渐变的正确方法是什么 The border image
  • 数组“包含”方法在 Google Apps 脚本中失败

    我试图在 Google Apps 脚本中对数组使用 includes 方法 但失败并显示 无法找到对象 1 4 3 7 中包含的函数 第 4 行 文件 test array 以下是代码 function test array var arr
  • Soundpool 还是媒体播放器?

    我正在为 Android 开发一款纸牌游戏 我希望每次投掷纸牌时都能播放投掷声音 这是同一个文件 我还会播放其他声音 例如背景音乐和某些点击声 您建议使用什么 声音池或创建 MediaPlayback 并播放它 每一个的优点 缺点是什么 我
  • 内联静态常量与静态常量变量

    我无法弄清楚哪种解决方案更好 因为我不清楚其中的区别 我想要一个包含一些可以在整个程序中自由使用的变量的文件 我的第一次尝试如下 头文件 Hosts h pragma once include
  • 从 Tkinter 框架调用函数到另一个框架

    我有一个页面 将在其中显示一些客户详细信息 因此 我创建了一个名为 客户详细信息 的页面 其中包含我需要的所有标签 并将这些标签的文本设置为变量 可惜它不起作用 标签创建于 init 方法 所以我无法 更新 它们 因为 init 仅在开始时
  • Android:如何检测assets文件夹中的目录?

    我正在检索这样的文件 String files assetFiles list EngagiaDroid 我们如何知道它是一个文件还是一个目录呢 我想循环访问资产文件夹中的目录 然后复制其所有内容 我认为更通用的解决方案 如果您有子文件夹等
  • 使用 spring-boot-admin-server 时创建名为“conversionServicePostProcessor”的 bean 时出错

    我试图为我的应用程序启用 Spring boot 管理服务器 默认设置工作得很好 但是当我尝试启用安全性时 出现以下错误 应用程序无法启动 描述 bean conversionServicePostProcessor 在类路径中定义 资源
  • 如何否定进程的返回值?

    我正在寻找一个简单但跨平台的negate 否定进程返回值的进程 它应该将 0 映射到某个值 0 并将任何值 0 映射到 0 即以下命令应返回 yes nonexistingpath 不存在 ls nonexistingpath negate
  • Python:通过变量名引用对象属性? [复制]

    这个问题在这里已经有答案了 我正在用 Python 编写棋盘游戏 大富翁 大富翁 拥有三种类型的土地供玩家购买 房产 如木板路 铁路和公用事业 房产有 6 种条件 0 4 栋房屋或酒店 的可变购买价格和租金 铁路和公用事业有固定的价格和租金
  • Alamofire 接受和内容类型 JSON

    我正在尝试在 Swift 中使用 Alamofire 发出 GET 请求 我需要设置以下标题 Content Type application json Accept application json 我可以绕过它并直接指定请求的标头 但我
  • 将数组打印到文件

    我想将数组打印到文件中 我希望该文件看起来与这样的代码完全相同 print r abc 假设 abc 是一个数组 是否有任何单行解决方案可以解决此问题 而不是每种外观都常规解决方案 P S 我目前使用序列化 但我想让文件可读 因为序列化数组
  • Object.defineProperty 获取/设置闭包

    好的 我尝试这样创建新对象 var src a a b b c c var out for var prop in src Object defineProperty out prop get function return src pro