使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
前言
本文主要给大家介绍的是关于使用Object.defineProperty巧妙找到修改某个变量的准确代码位置的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧
语法
Object.defineProperty(obj, prop, descriptor)
参数
- obj 需要定义属性的对象。
- prop 需被定义或修改的属性名。
- descripter 需被定义或修改的属性的描述符。
发现问题
最近的工作又遇到一个难题。前端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
的代码位置。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
您可能感兴趣的文章:
- 善用Object.defineProperty巧妙找到修改某个变量的准确代码位置
- 在storyboard中设置一个一个button,只进行了位置设置,没有使用约束,发现用代码修改不了如何解决
- JS进阶篇--JS apply的巧妙用法以及扩展到Object.defineProperty的使用
- Unity-关于Rigidbody如何使用代码冻结位置和旋转
- 在WORD文档里每一页的相同位置插入不同的图片的宏代码如何修改?
- 如何统计网站访问量,代码实现使用全局变量 Application,start,end,Session_start,Session_end事件
- 使用Object.defineProperty重新定义属性时需要注意的一点
- Unity3D-ScrollView中使用Layout布局后用代码如何控制ScrollView移动到指定位置
- 如何修改本地代码,并更新到github,及其他使用技巧
- C# vs中应用设置变量如何绑定及代码中如何使用
- 如何使用SmartGit快速上传下载新建分支修改代码
- xib中使用Autolayout进行布局,在代码里面如何进行修改布局
- User Location API 的使用/如何判断 找到的 位置提供者是最好的
- 如何修改Revit中墙,梁,管道等的端点位置。实例代码演示修改管道的倾斜角度
- 如何统计网站访问量,代码实现使用全局变量 Application,start,end,Session_start,Session_end事件
- [置顶] 如何统计网站访问量,代码实现使用全局变量 Application,start,end,Session_start,Session_end事件
- 在C#开发中如何使用Client Object Model客户端代码获得SharePoint 网站、列表的权限情况
- 横竖屏切换时如何在代码中动态修改位置属性.txt
- 手机使用了QWERTY keypad,想要在idle home screen时长按SHIFT键进行静音模式切换,该如何修改代码