问题
let data = {
name: "jack",
};
function initDP(data) {
for (let key in data) {
odp(data, key);
}
}
function odp(obj, key) {
Object.defineProperty(obj, key, {
get: function () {
console.log("u get:", key);
return obj[key]; // 问题出在这里
},
});
}
initDP(data);
console.log(data.name);
原因
return obj[key]
这个代码,会无限次触发getter。
解决
既然obj[key]
触发getter,那我换一个变量代替obj
就好了。
本次利用了深拷贝Object.assign()
:
function odp(obj, key) {
let _d = Object.assign({}, obj); // 修改 1
Object.defineProperty(obj, key, {
get: function () {
console.log("u get:", key);
return _d[key]; // 修改 2
},
});
}
一切正常。
总结
一个变量引发出的bug。