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

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



  
  
  
  

巴扎黑
巴扎黑

全部回复(2)
巴扎黑

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;
            },
        });
    }
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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