使用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封装的对话框简单实现
Jul 21 Javascript
js 3种归并操作的实例代码
Oct 30 Javascript
详解基于javascript实现的苹果系统底部菜单
Dec 02 Javascript
bootstrap fileinput 上传插件的基础使用
Feb 17 Javascript
整理关于Bootstrap过渡动画的慕课笔记
Mar 29 Javascript
layui表格实现代码
May 20 Javascript
ES6深入理解之“let”能替代”var“吗?
Jun 28 Javascript
vue 简单自动补全的输入框的示例
Mar 12 Javascript
微信小程序CSS3动画下拉菜单效果
Nov 04 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
May 10 jQuery
vue将文件/图片批量打包下载zip的教程
Oct 21 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
Nov 11 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
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
亲密接触PHP之PHP语法学习笔记1
2006/12/17 PHP
IStream与TStream之间的相互转换
2008/08/01 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
2014/06/13 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
精通Javascript系列之数值计算
2011/06/07 Javascript
$.format,jquery.format 使用说明
2011/07/13 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
jQuery对象与DOM对象转换方法详解
2016/05/10 Javascript
JavaScript 随机验证码的生成实例代码
2016/09/22 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
2018/06/23 Javascript
mac上配置Android环境变量的方法
2018/07/08 Javascript
微信小程序开发之自定义tabBar的实现
2018/09/06 Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
2020/04/11 Javascript
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
Python 12306抢火车票脚本
2018/02/07 Python
浅谈python下tiff图像的读取和保存方法
2018/12/04 Python
pyhton中__pycache__文件夹的产生与作用详解
2019/11/24 Python
Python中Subprocess的不同函数解析
2019/12/10 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
selenium携带cookies模拟登陆CSDN的实现
2021/01/19 Python
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
木工主管岗位职责
2013/12/08 职场文书
信息总监管理职责范本
2014/03/08 职场文书
群众路线个人自我剖析材料
2014/10/07 职场文书
主题班会开场白
2015/06/01 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
JS实现扫雷项目总结
2021/05/19 Javascript
Django与数据库交互的实现
2021/06/03 Python
电脑开机弹出documents文件夹怎么回事?弹出documents文件夹解决方法
2022/04/08 数码科技