使用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 相关文章推荐
js调试系列 控制台命令行API使用方法
Jun 18 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
Apr 07 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
Dec 09 Javascript
基于javascript实现tab选项卡切换特效调试笔记
Mar 30 Javascript
图解prototype、proto和constructor的三角关系
Jul 31 Javascript
CSS3 3D 技术手把手教你玩转
Sep 02 Javascript
jQuery常见的选择器及用法介绍
Dec 20 Javascript
react中使用swiper的具体方法
May 15 Javascript
vue中的mvvm模式讲解
Jan 31 Javascript
JavaScript中var的重要性实例分析
Jul 09 Javascript
微信小程序使用GoEasy实现websocket实时通讯
May 19 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
Oct 29 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
杏林同学录(八)
2006/10/09 PHP
php 301转向实现代码
2008/09/18 PHP
thinkphp循环结构用法实例
2014/11/24 PHP
php防止网站被攻击的应急代码
2015/10/21 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
Laravel实现autoload方法详解
2017/05/07 PHP
laravel-admin 实现给grid的列添加行数序号的方法
2019/10/08 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
我的javascript 函数链之演变
2011/04/07 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
jQuery中$.extend()用法实例
2015/06/24 Javascript
JavaScript+CSS无限极分类效果完整实现方法
2015/12/22 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
实现JavaScript的组成----BOM和DOM详解
2016/05/18 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
如何在微信小程序中存setStorage
2019/12/13 Javascript
js实现无缝轮播图效果
2020/03/09 Javascript
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
python 爬取英雄联盟皮肤并下载的示例
2020/12/04 Python
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
小学语文教学反思
2014/02/10 职场文书
主题班会演讲稿
2014/05/22 职场文书
服务行业口号
2014/06/11 职场文书
金融管理专业求职信
2014/07/10 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
《检阅》教学反思
2016/02/22 职场文书
Python实现位图分割的效果
2021/11/20 Python
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS