使用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 相关文章推荐
网页右侧悬浮滚动在线qq客服代码示例
Apr 28 Javascript
JavaScript极简入门教程(三):数组
Oct 25 Javascript
javascript实现继承的简单实例
Jul 26 Javascript
JS文字球状放大效果代码分享
Aug 19 Javascript
js滑动提示效果代码分享
Mar 10 Javascript
jQuery设置Cookie及删除Cookie实例分析
Apr 15 Javascript
JS实现的幻灯片切换显示效果
Sep 07 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
Feb 13 Javascript
JS请求servlet功能示例
Jun 01 Javascript
详解基于electron制作一个node压缩图片的桌面应用
Jan 29 Javascript
vue全局自定义指令-元素拖拽的实现代码
Apr 14 Javascript
Vue+Express实现登录注销功能的实例代码
May 05 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
肝肠寸断了解下!盘点史上最伤心的十大动漫
2020/03/04 日漫
php 抽象类的简单应用
2011/09/06 PHP
php实例分享之二维数组排序
2014/05/15 PHP
php字符串操作常见问题小结
2016/10/11 PHP
PHP PDOStatement::nextRowset讲解
2019/02/01 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
Firefox outerHTML实现代码
2009/06/04 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
javascript 兼容所有浏览器的DOM扩展功能
2012/08/01 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
javascript中Date()函数在各浏览器中的显示效果
2015/06/18 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
jQuery获取table表中的td标签(实例讲解)
2017/07/28 jQuery
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
vue data有值,但是页面{{}} 取不到值的解决
2020/11/09 Javascript
Python制作词云的方法
2018/01/03 Python
python实现求解列表中元素的排列和组合问题
2018/03/15 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
python的scikit-learn将特征转成one-hot特征的方法
2018/07/10 Python
TensorFLow 变量命名空间实例
2020/02/11 Python
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
我的大学生活演讲稿
2014/04/25 职场文书
毕业实习证明(4篇)
2014/10/28 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
2014年保安个人工作总结
2014/11/13 职场文书
《观潮》教学反思
2016/02/17 职场文书
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android