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

  • 相关阅读:
    数据库字段包含反斜杠的查询处理
    sql中的日期时间处理
    查询时间的测试
    group by 和 聚合函数的使用
    比较版本号
    sql IIF函数的应用
    win10系统杀毒功能
    php性能的问题
    linux 下ab压力测试
    datatables的学习总结
  • 原文地址:https://www.cnblogs.com/qingjiawen/p/13415813.html
Copyright © 2011-2022 走看看