使用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 相关文章推荐
设置下载不需要倒计时cookie(倒计时代码)
Nov 19 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
Oct 08 Javascript
原生js ActiveXObject获取execl里面的值
Nov 01 Javascript
学习JavaScript设计模式(链式调用)
Nov 26 Javascript
基于JavaScript实现添加到购物车效果附源码下载
Aug 22 Javascript
JS实现获取当前URL和来源URL的方法
Aug 24 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
Aug 29 Javascript
Vue.js快速入门实例教程
Oct 15 Javascript
JS按钮闪烁功能的实现代码
Jul 21 Javascript
浅谈vue中数据双向绑定的实现原理
Sep 14 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
Dec 18 Javascript
JS实现随机抽选获奖者
Nov 07 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下使用strpos需要注意 === 运算符
2010/07/17 PHP
2014过年倒计时示例
2014/01/31 PHP
php单例模式实现方法分析
2015/03/14 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
wampserver改变默认网站目录的办法
2015/08/05 PHP
php识别翻转iphone拍摄的颠倒图片
2018/05/17 PHP
php app支付宝回调(异步通知)详解
2018/07/25 PHP
Js 回车换行处理的办法及replace方法应用
2013/01/24 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
微信小程序 数据封装,参数传值等经验分享
2017/01/09 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
AngularJS实现自定义指令及指令配置项的方法
2017/11/20 Javascript
纯js实现隔行变色效果
2017/11/29 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
JavaScript 作用域实例分析
2019/10/02 Javascript
Echarts实现单条折线可拖拽效果
2019/12/19 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
python微信跳一跳系列之色块轮廓定位棋盘
2018/02/26 Python
浅谈python 中类属性共享的问题
2019/07/02 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
python读取指定字节长度的文本方法
2019/08/27 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
2020/04/28 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
个人评价范文分享
2014/01/11 职场文书
广播节目策划方案
2014/05/23 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
诚信考试主题班会
2015/08/17 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书