扫码关注官方订阅号
我怎么感觉是 触发了 get 事件,并且打出的是 get 调用后的返回值 undefined;我该如何打出 变化后的值?
https://developer.mozilla.org...
一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。该方法返回值被用作属性值。默认为 undefined。
<!DOCTYEP html> <html> <head></head> <body> <script> var data = { user: { a: { "name": "a", }, b: { "name": "b" } }, city: "xxxx", time: 2016 } function observe(obj) { for (var i in obj) { if (Object.prototype.toString.call(obj[i]) == "[object Object]") { observe(obj[i]); } var val = obj[i]; Object.defineProperty(obj, i, { get: function () { return val }, set: function (newVal) { console.log(obj, "的", i, "属性已经改变 :", obj[i], "--->", newVal); } }); } } observe(data); data.time = 2017; console.log(data.time); </script> </body> </html>
defineProperty设置set的时候不是extend,而是覆盖的。你的这个写法没有get方法,也没有在set中设置值,虽然会显示属性改变,但是实际上却没有这个值。此外,i的值会被绑定到循环的最后,需要吧var改成let, 否则无论你改什么,都会变成改最后一个属性。大约是改成这样:
function observe(obj) { var tmp = {} for (let i in obj) { if (Object.prototype.toString.call(obj[i]) == "[object Object]") { observe(obj[i]); } tmp[i] = obj[i]; Object.defineProperty(obj, i, { get: function () { return tmp[i]; }, set: function (val) { console.log(i, "属性已经改变 :", tmp[i], "--->", val); tmp[i] = val; }, }); } }
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
https://developer.mozilla.org...
一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。该方法返回值被用作属性值。默认为 undefined。
defineProperty设置set的时候不是extend,而是覆盖的。
你的这个写法没有get方法,也没有在set中设置值,虽然会显示属性改变,但是实际上却没有这个值。
此外,i的值会被绑定到循环的最后,需要吧var改成let, 否则无论你改什么,都会变成改最后一个属性。
大约是改成这样: