使用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 相关文章推荐
Flash对联广告的关闭按钮讨论
Jan 30 Javascript
ajax 缓存 问题 requestheader
Aug 01 Javascript
JavaScript检测字符串中是否含有html标签实现方法
Jul 01 Javascript
浅谈Javascript线程及定时机制
Jul 02 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
Aug 31 Javascript
js的OOP继承实现(必看篇)
Feb 18 Javascript
基于vue的fullpage.js单页滚动插件
Mar 20 Javascript
从零开始搭建webpack+react开发环境的详细步骤
May 18 Javascript
vue框架搭建之axios使用教程
Jul 11 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
May 30 Javascript
小程序两种滚动公告栏的实现方法
Sep 17 Javascript
代码解析React中setState同步和异步问题
Jun 03 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
基于PHP文件操作的详解
2013/06/05 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
zend framework中使用memcache的方法
2016/03/04 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
2012/08/24 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
2016/03/04 Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
2017/03/20 Javascript
angular动态删除ng-repaeat添加的dom节点的方法
2017/07/20 Javascript
实现一个完整的Node.js RESTful API的示例
2017/09/29 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
localstorage实现带过期时间的缓存功能
2019/06/28 Javascript
使用Python判断IP地址合法性的方法实例
2014/03/13 Python
python中装饰器级连的使用方法示例
2017/09/29 Python
Python理解递归的方法总结
2019/01/28 Python
python-Web-flask-视图内容和模板知识点西宁街
2019/08/23 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
Python数组并集交集补集代码实例
2020/02/18 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
Python中Selenium模块的使用详解
2020/10/09 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
Saks Fifth Avenue澳洲/亚太地区:萨克斯第五大道精品百货店
2019/06/09 全球购物
Pottery Barn阿联酋:购买家具、家居装饰及更多
2019/12/08 全球购物
文秘个人求职信范文
2014/04/22 职场文书
好书伴我成长演讲稿
2014/05/14 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
节约粮食标语
2014/06/18 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
公司仓库管理制度
2015/08/04 职场文书
详解JS ES6编码规范
2021/05/07 Javascript
Python中的tkinter库简单案例详解
2022/01/22 Python
redis protocol通信协议及使用详解
2022/07/15 Redis