1. 程式人生 > 實用技巧 >Object.defineProperty獲取(get)/設定(set)閉包

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 由於沒有關閉而獲得正確的值。它在呼叫時被呼叫,而不是在迴圈完成後呼叫。