javascript - 用Object.definePrototype 的 set 监听属性的变化,最后输出 变化了的属性 为什么是 undefine
巴扎黑
巴扎黑 2017-04-11 12:32:16
[JavaScript讨论组]

我怎么感觉是 触发了 get 事件,并且打出的是 get 调用后的返回值 undefined;
我该如何打出 变化后的值?



  
  
  
  

巴扎黑
巴扎黑

全部回复(1)
阿神

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中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号