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

  • 相关阅读:
    单链队列
    栈的顺序存储表示
    顺序队列
    串的定长顺序存储表示
    串的堆分配存储
    双向循环链表
    单循环链表的表示和实现
    串的块链存储表示
    线性表的顺序表示和实现
    线性表的单链表表示和实现
  • 原文地址:https://www.cnblogs.com/qingjiawen/p/13415813.html
Copyright © 2011-2022 走看看