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


Posted in Javascript onNovember 02, 2018

前言

本文主要给大家介绍的是关于使用Object.defineProperty巧妙找到修改某个变量的准确代码位置的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

语法

Object.defineProperty(obj, prop, descriptor)

参数

  • obj 需要定义属性的对象。
  • prop 需被定义或修改的属性名。
  • descripter 需被定义或修改的属性的描述符。

发现问题

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

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

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

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

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

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

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

解决方法

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

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

使用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;}});

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

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

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

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
双击滚屏-常用推荐
Nov 29 Javascript
JS代码判断IE6,IE7,IE8,IE9的函数代码
Aug 02 Javascript
js读取csv文件并使用json显示出来
Jan 09 Javascript
javascript生成大小写字母
Jul 03 Javascript
JavaScript实现简单Tip提示框效果
Apr 20 Javascript
JavaScript中闭包的写法和作用详解
Jun 29 Javascript
阿里云ecs服务器中安装部署node.js的步骤
Oct 08 Javascript
JS中对数组元素进行增删改移的方法总结
Dec 15 Javascript
简单实现js上传文件功能
Aug 21 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
May 10 Javascript
vue中keep-alive的用法及问题描述
May 15 Javascript
vue-router 起步步骤详解
Mar 26 Javascript
微信小程序实现点赞、取消点赞功能
Nov 02 #Javascript
Vue利用History记录上一页面的数据方法实例
Nov 02 #Javascript
vue如何根据网站路由判断页面主题色详解
Nov 02 #Javascript
小程序实现列表点赞功能
Nov 02 #Javascript
Vue中的vue-resource示例详解
Nov 02 #Javascript
微信小程序实现列表页的点赞和取消点赞功能
Nov 02 #Javascript
React如何解决fetch跨域请求时session失效问题
Nov 02 #Javascript
You might like
《被神捡到的男人》动画化计划进行中!
2020/03/06 日漫
PHP图片自动裁切应付不同尺寸的显示
2014/10/16 PHP
php自定义时间转换函数示例
2016/12/07 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
纯JAVASCRIPT图表动画插件Highcharts Examples
2011/04/16 Javascript
jquery学习笔记 用jquery实现无刷新登录
2011/08/08 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
JavaScript基于自定义函数判断变量类型的实现方法
2016/11/23 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
4个顶级开源JavaScript图表库
2018/09/29 Javascript
JS调用安卓手机摄像头扫描二维码
2018/10/16 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
python删除文件示例分享
2014/01/28 Python
Python中的生成器和yield详细介绍
2015/01/09 Python
python操作sqlite的CRUD实例分析
2015/05/08 Python
Python多线程扫描端口代码示例
2018/02/09 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
pytorch点乘与叉乘示例讲解
2019/12/27 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
船餐厅和泰晤士河餐饮游轮:Bateaux London
2018/03/19 全球购物
巴西最好的男鞋:Rafarillo
2018/05/25 全球购物
比驿:全球酒店比价网
2018/06/20 全球购物
来自世界上最好大学的在线课程:edX
2018/10/16 全球购物
加拿大鞋网:Globo Shoes
2019/12/26 全球购物
毕业生精彩的自我评价分享
2013/10/06 职场文书
无故旷工检讨书
2014/01/26 职场文书
大学生毕业求职信
2014/06/12 职场文书
2016高考寄语集锦
2015/12/04 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
SQL Server使用T-SQL语句批处理
2022/05/20 SQL Server
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript