使用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 相关文章推荐
Flow之一个新的Javascript静态类型检查器
Dec 21 Javascript
AngularJS入门教程之过滤器详解
Aug 19 Javascript
jQuery基本过滤选择器用法示例
Sep 09 Javascript
javascript实现页面滚屏效果
Jan 17 Javascript
Bootstrap3下拉菜单的实现
Feb 22 Javascript
Angularjs 实现移动端在线测评效果(推荐)
Apr 05 Javascript
javascript按钮禁用和启用的效果实例代码
Oct 29 Javascript
node.js之基础加密算法模块crypto详解
Sep 11 Javascript
详解React中合并单元格的正确写法
Jan 08 Javascript
js脚本中执行java后台代码方法解析
Oct 11 Javascript
JavaScript鼠标悬停事件用法解析
May 15 Javascript
JavaScript使用prototype属性实现继承操作示例
May 22 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
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
基于PHP实现微信小程序客服消息功能
2019/08/12 PHP
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
2015/05/14 Javascript
移动端JQ插件hammer使用详解
2015/07/03 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
2017/01/04 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
angular.js 路由及页面传参示例
2017/02/24 Javascript
vue 数组和对象不能直接赋值情况和解决方法(推荐)
2017/10/25 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
详解vue 组件
2020/06/11 Javascript
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
学习python处理python编码问题
2011/03/13 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
设置python3为默认python的方法
2018/10/31 Python
Python中的类与类型示例详解
2019/07/10 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
pytorch 把图片数据转化成tensor的操作
2021/03/04 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
华三通信H3C面试题
2015/05/15 面试题
预备党员入党思想汇报
2014/01/04 职场文书
学生党支部工作总结2015
2015/05/26 职场文书
总结Python使用过程中的bug
2021/06/18 Python
Redis分布式锁Redlock的实现
2021/08/07 Redis
Python+Tkinter制作专属图形化界面
2022/04/01 Python