Object.defineProperty獲取(get)/設定(set)閉包
阿新 • • 發佈:2020-08-01
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 由於沒有關閉而獲得正確的值。它在呼叫時被呼叫,而不是在迴圈完成後呼叫。