使用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 相关文章推荐
jQuery 加上最后自己的验证
Nov 04 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
Oct 15 Javascript
js对table的td进行相同内容合并示例详解
Dec 27 Javascript
javascript学习笔记(五)原型和原型链详解
Oct 08 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
Dec 22 Javascript
详解js中class的多种函数封装方法
Jan 03 Javascript
JavaScript学习笔记整理_setTimeout的应用
Sep 19 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
Sep 30 Javascript
利用express启动一个server服务的方法
Sep 17 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
Dec 25 Javascript
基于js 各种排序方法和sort方法的区别(详解)
Jan 03 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
Oct 25 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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
PHP实现多文件上传的方法
2015/07/08 PHP
利用ajax和PHP实现简单的流程管理
2017/03/23 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
2006/06/26 Javascript
js每次Title显示不同的名言
2008/09/25 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
php中给js数组赋值方法
2014/03/10 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
js实现图片淡入淡出切换简易效果
2016/08/22 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
jQuery访问浏览器本地存储cookie、localStorage和sessionStorage的基本用法
2017/10/20 jQuery
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
layui table单元格事件修改值的方法
2019/09/24 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
vue项目中js-cookie的使用存储token操作
2020/11/13 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
python实现爬取千万淘宝商品的方法
2015/06/30 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
Python如何实现强制数据类型转换
2019/11/22 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书
2015年秋季运动会前导词
2015/07/20 职场文书
反四风问题学习心得体会
2016/01/22 职场文书
七年级作文之下雨天
2019/12/23 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python