使用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 相关文章推荐
javascript学习笔记(十二) RegExp类型介绍
Jun 20 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
Nov 08 Javascript
2014年50个程序员最适用的免费JQuery插件
Dec 15 Javascript
javascript获得当前的信息的一些常用命令
Feb 25 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
Oct 26 Javascript
js性能优化技巧
Nov 29 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
May 17 Javascript
详解Angular 自定义结构指令
Jun 21 Javascript
35个最好用的Vue开源库(史上最全)
Jan 03 Javascript
详解Vue、element-ui、axios实现省市区三级联动
May 07 Javascript
JavaScript定时器设置、使用与倒计时案例详解
Jul 08 Javascript
前端实现滑动按钮AJAX与后端交互的示例代码
Feb 24 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实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
php实现webservice实例
2014/11/06 PHP
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
javascript工具库代码
2012/03/29 Javascript
js获取单选框或复选框值及操作
2012/12/18 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
jquery对象和DOM对象的任意相互转换
2016/02/21 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
jQuery中的deferred使用方法
2017/03/27 jQuery
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
微信小程序如何使用canvas二维码保存至手机相册
2019/07/15 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
Python内置模块turtle绘图详解
2017/12/09 Python
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
程序员写Python时的5个坏习惯,你有几条?
2018/11/26 Python
python地震数据可视化详解
2019/06/18 Python
python设置环境变量的作用和实例
2019/07/09 Python
keras打印loss对权重的导数方式
2020/06/10 Python
Python异常处理机制结构实例解析
2020/07/23 Python
Giglio德国网上精品店:奢侈品服装和配件
2016/09/23 全球购物
英国拳击装备购物网站:RDX Sports
2018/01/23 全球购物
全球立体声:World Wide Stereo
2018/09/29 全球购物
个人求职信范文分享
2014/01/31 职场文书
成都人事代理协议书
2014/10/25 职场文书
解除租房协议书
2014/12/03 职场文书
施工员岗位职责范本
2015/04/11 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
合同范本之电脑出租
2019/08/13 职场文书
常用的Python代码调试工具总结
2021/06/23 Python
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS
Linux安装Docker详细教程
2022/07/07 Servers