使用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 相关文章推荐
自适应图片大小的弹出窗口
Jul 27 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
Apr 11 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
May 05 Javascript
网站基于flash实现的Banner图切换效果代码
Oct 14 Javascript
jQuery中$.extend()用法实例
Jun 24 Javascript
简单总结JavaScript中的String字符串类型
May 26 Javascript
Angular.js 实现数字转换汉字实例代码
Jul 14 Javascript
Bootstrap中表单控件状态(验证状态)
Aug 04 Javascript
如何解决hover在ie6中的兼容性问题
Dec 15 Javascript
JQuery 获取多个select标签option的text内容(实例)
Sep 07 jQuery
JS动画定时器知识总结
Mar 23 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
Mar 14 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 进度条实现代码
2009/03/10 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
PHP的全局错误处理详解
2016/04/25 PHP
php实现图片按比例截取的方法
2017/02/06 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
PhpStorm连接服务器并实现自动上传功能
2020/12/09 PHP
JavaScript学习笔记(十)
2010/01/17 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
[37:45]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS Orenda
2014/05/22 DOTA
python重试装饰器示例
2014/02/11 Python
python 随机数使用方法,推导以及字符串,双色球小程序实例
2017/09/12 Python
python实现静态服务器
2019/09/05 Python
Python any()函数的使用方法
2019/10/28 Python
Python datetime 格式化 明天,昨天实例
2020/03/02 Python
python环境下安装opencv库的方法
2020/03/05 Python
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
UGG雪地靴德国官网:UGG德国
2016/11/19 全球购物
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
什么是URL
2015/12/13 面试题
理财计划书
2014/08/14 职场文书
好人好事演讲稿
2014/09/01 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
教育见习报告范文
2014/11/03 职场文书
写给媳妇的检讨书
2015/05/06 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
初三数学教学反思
2016/02/17 职场文书
医学会议开幕词
2016/03/03 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
2021/04/01 PHP
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python