Object.defineProperty()的set方法除了用于双向绑定还能干嘛?

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/liusaint1992/article/details/77986959

对vue双向绑定原理稍有了解的人都知道es5给Object增加了defineProperty这个方法,可以监控对象的变化,vue也用了它来实现双向绑定。那么这个方法除了用于双向绑定还能做什么呢?

最近给一个很复杂的项目迭代维护。这个项目很多早期功能是其他人开发的,中间有很多隐藏的坑。
今天遇到一个bug,经过断点调试相关功能,将问题定位到一个全局变量上,在断点开始的时候它的值是true,在运行了大量代码之后,它的值变成了false。断点跟踪了老长一段距离,都没有头绪。还是在坑爹的ie9下面调试。
于是我想,如何监测到这个变量是在哪里发生变化的呢,发生变化的时候的调用栈是什么样子的呢。然后就想到了defineProperty方法。一试,果然很迅速地找到了发生变化的时候的调用栈。
代码如下:

Object.defineProperty(window, 'expUpdate', {
    get: function() {

    },
    set: function(value) {
        debugger;
    }
});

在公共js中放入上面代码,再运行。
很顺利地定位到了改变这个全局变量的地方。
是在一个富文本编辑器源码里。(我们的项目对富文本编辑器的源码做了一些修改)。
成功定位问题,解决就是分分钟的事了。解决问题时候顺便还解决了一个潜在的逻辑bug。

做程序久了,就会发现程序很多人都能写,但是解bug的能力却是相差很大。一方面要经验,另一方面也要对技巧的总结和对技术的运用思考。在不同的场景使用不同的方法,可以大大提高定位问题的准确性和解决问题的效率。

猜你喜欢

转载自blog.csdn.net/liusaint1992/article/details/77986959
今日推荐