使用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 相关文章推荐
Sample script that displays all of the users in a given SQL Server DB
Jun 16 Javascript
Javascript 继承机制实例
Aug 12 Javascript
图片延迟加载的实现代码(模仿懒惰)
Mar 29 Javascript
JS实现下拉框的动态添加(附效果)
Apr 03 Javascript
jQuery遍历json的方法分析
Apr 16 Javascript
浅谈jQuery添加的HTML,JS失效的问题
Oct 05 Javascript
关于webuploader插件使用过程遇到的小问题
Nov 07 Javascript
js自定义弹框插件的封装
Aug 24 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
Jul 17 Javascript
微信小程序实现自定义picker选择器弹窗内容
May 26 Javascript
详解微信小程序开发(项目从零开始)
Jun 06 Javascript
vant自定义二级菜单操作
Nov 02 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 ZipArchive压缩函数详解实例
2013/11/06 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
基于逻辑运算的简单权限系统(实现) JS 版
2007/03/24 Javascript
javascript Excel操作知识点
2009/04/24 Javascript
JavaScript Sort 表格排序
2009/10/31 Javascript
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
window.print打印指定div实例代码
2013/12/13 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
jquery获取所有选中的checkbox实现代码
2016/05/26 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
python中list列表的高级函数
2016/05/17 Python
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
Python将列表中的元素转化为数字并排序的示例
2019/12/25 Python
幼儿园春游活动方案
2014/01/19 职场文书
大学生的自我鉴定范文
2014/01/21 职场文书
自考毕业自我鉴定
2014/03/18 职场文书
小学教师寄语大全
2014/04/03 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
护理工作个人总结
2015/03/03 职场文书
培训班通知
2015/04/25 职场文书
反邪教观后感
2015/06/11 职场文书
防溺水主题班会教案
2015/08/12 职场文书
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers