资讯专栏INFORMATION COLUMN

善用Object.defineProperty巧妙找到修改某个变量的准确代码位置

happyhuangjinjin / 1891人阅读

摘要:我今天的工作又遇到一个难题。前端右下角这个按钮被设置为禁用状态。这个按钮的可用状态由属性控制。而行执行之前,还没有这个的属性。我成功找到了我在寻找的给添加了的代码位置。

我今天的工作又遇到一个难题。前端UI右下角这个按钮被设置为"禁用(disabled)"状态。

这个按钮的可用状态由属性enabled控制。我通过调试发现,一旦下图第88行代码执行完毕之后,这个按钮的属性mProperties里就多出一个enabled:false的属性。

而88行执行之前,还没有这个enabled:false的属性。正是这个属性让按钮进入了禁用状态。

我单步调试setModel函数,花了半个小时的时间也没能找到这个enabled属性到底是在哪一行代码加进去的。

于是我只有寻求其他办法。我想到了Object.defineProperty这个方法:

我在Chrome开发者工具里执行如下代码,首先根据button的ID用ui.byId方法找到这个被禁用按钮的实例,然后用Object.defineProperty给按钮实例的属性集合mProperties注入一个get方法,实现体只有一个debugger语句。如此一来,每次button的mProperties被访问时,都会自动触发一个断点。而mProperties属性发生变化时,必定会先产生读取动作,因此断点停下来时,我通过观察调用栈的上下文就能够找到是哪一行代码修改了mProperties。

var ui = sap.ui.getCore();

var button = ui.byId("button97DXvDVKUawkYgK3YQVram_64");

Object.defineProperty(button, "mProperties", { get: function(){ debugger;}});

现在就来试试。果然断点自动触发了。我成功找到了我在寻找的给mProperties添加了enabled = false的代码位置。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98732.html

相关文章

  • 善用Object.defineProperty巧妙找到修改某个变量准确代码位置

    摘要:我今天的工作又遇到一个难题。前端右下角这个按钮被设置为禁用状态。这个按钮的可用状态由属性控制。而行执行之前,还没有这个的属性。我成功找到了我在寻找的给添加了的代码位置。 我今天的工作又遇到一个难题。前端UI右下角这个按钮被设置为禁用(disabled)状态。 showImg(https://segmentfault.com/img/remote/1460000016811187); 这...

    Turbo 评论0 收藏0
  • JS进阶篇--JS apply巧妙用法以及扩展到Object.defineProperty使用

    摘要:的使用对象是由多个名值对组成的无序的集合。目标属性所拥有的特性返回值传入函数的对象。是一种获得属性值的方法是一种设置属性值的方法。参考相关阅读链接基础篇中的可枚举属性与不可枚举属性以及扩展 Math.max 实现得到数组中最大的一项 var array = [1,2,3,4,5]; var max = Math.max.apply(null, array); console.log(m...

    jasperyang 评论0 收藏0
  • 编写简单i18n库

    摘要:因为两次的开发维护体验产生了对比,使我产生了不小的兴趣假设一个简单的页面需要多语言。两个简单的区别就是和替换的区别。样式模式其实就是简单的切换。当修改的某个值时,会触发对应的,并发射信号通知节点去更新。 i18n是什么?i18n(其来源是英文单词internationalization的首末字符i和n,18为中间的字符数)是国际化的简称。 前言 第一次接触多语言是用野生javascri...

    txgcwm 评论0 收藏0
  • 编写简单i18n库

    摘要:因为两次的开发维护体验产生了对比,使我产生了不小的兴趣假设一个简单的页面需要多语言。两个简单的区别就是和替换的区别。样式模式其实就是简单的切换。当修改的某个值时,会触发对应的,并发射信号通知节点去更新。 i18n是什么?i18n(其来源是英文单词internationalization的首末字符i和n,18为中间的字符数)是国际化的简称。 前言 第一次接触多语言是用野生javascri...

    DevWiki 评论0 收藏0
  • js中对象属性整理

    摘要:不管函数还是数据,都可以称为某某对象的属性。一些细节输出结果如下可以看出,函数是有的数据属性是创建对象时定义的,所有属性特性都是是用定义的,默认为数据属性,所有属性特性默认为。访问器属性暂时想到的,就是通过改变该属性改变内部多个属性。 都知道js是面向对象的,创建了对象后,对象中保存的就是一组组名值对,值可以是数据类型或函数。不管函数还是数据,都可以称为某某对象的属性。再细分,属性可以...

    lavor 评论0 收藏0

发表评论

0条评论

happyhuangjinjin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<