我今天的工作又遇到一个难题。前端UI右下角这个按钮被设置为"禁用(disabled)"状态。

这个按钮的可用状态由属性enabled控制。我通过调试发现,一旦下图第88行代码执行完毕之后,这个按钮的属性mProperties里就多出一个enabled:false的属性。

而88行执行之前,还没有这个enabled:false的属性。正是这个属性让按钮进入了禁用状态。

我单步调试setModel函数,花了半个小时的时间也没能找到这个enabled属性到底是在哪一行代码加进去的。

于是我只有寻求其他办法。我想到了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;}});

现在就来试试。果然断点自动触发了。我成功找到了我在寻找的给mProperties添加了enabled = false的代码位置。

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

善用Object.defineProperty巧妙找到修改某个变量的准确代码位置相关推荐

  1. 对javscript中Object.defineProperty的理解

      自己在使用vue的过程中经常会用到听到数据双向绑定这个词,而且我们还可以直接通过调用this.msg(this表示vue实例),来获取data上的数据,以前一直不太明白为什么可以这样获取,直到有一 ...

  2. Vue的数据双向绑定和Object.defineProperty()

    Vue是前端三大框架之一,也被很多人指责抄袭,说他的两个核心功能,一个数据双向绑定,一个组件化分别抄袭angular的数据双向绑定和react的组件化思想,咱们今天就不谈这种大是大非,当然我也没到达那 ...

  3. Object.defineProperty()个人理解

    Object.defineProperty()个人理解 Object.defineProperty()用于定义对象中属性的特性,这些特性属于对象内部值,因此在JS中不能直接访问它们. 在ES5中,有两 ...

  4. 【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )

    文章目录 一.直接修改 和 间接修改 指针变量 的值 二.在函数中 间接修改 指针变量 的值 三.在函数中 间接修改 外部变量 的原理 一.直接修改 和 间接修改 指针变量 的值 直接修改 指针变量 ...

  5. JavaScript变量高级定义之Object.defineProperty()方法讲解

    简介 Object.defineProperty()方法是用于声明一个变量,类似var let,但是他可以做一些比较高级的选项. 最基本的使用: <!DOCTYPE html> <h ...

  6. js中Object类型和Array类型的变量被赋值(复制)给其他变量后,修改被赋值(复制)的新变量的值,会影响原始变量的值,这是为什么呢?

    JavaScript中的Object和Array都是指针变量类型,例如我声明 let obj={a:1};let arr=[1,2,3]; 其中的obj和arr存放的仅仅是对应的对象和数组内容所存放的 ...

  7. 利用Object.defineProperty挂接set钩子,监控对象属性的修改事件

    测试代码: <html> <script> "use strict"; function test(){Object.defineProperty(wind ...

  8. es6相关面试题:1.rest参数;2.new.target;3.object.defineProperty与Proxy的区别;4.Reflect对象作用;5.lterator迭代器;6.async

    文章目录 说说对ES6中rest参数的理解 说说你对new.target的理解 谈谈object.defineProperty与Proxy的区别 ES6中的Reflect对象有什么用? 简单介绍下ES ...

  9. Vue2双向绑定,Object.defineProperty、Observe、Compile、Watcher、Dep各显神通,相辅相成

    这个问题真的可以说是一个好问题,毕竟基本上面试时也总会被问到,一问双向绑定原理怎么回事儿啊?就说,用了Object.defineProperty()做得数据劫持,劫持了get()和set(),然后巴拉 ...

最新文章

  1. Java使用字节码和汇编语言同步分析volatile,synchronized的底层实现
  2. 手机qq2008触屏版_比微信老却是00后最爱 手机QQ 16年进化史
  3. APS:大型多模态室内摄像机定位系统
  4. python3 文件 复制、重命名、移动、删除
  5. 下载安装tomcat6.0
  6. QT qml---- loader使用方法
  7. 免师计算机与学前教育,2014届河南免师生源分布.doc
  8. RTSP、RTMP、HTTP协议区别
  9. SQL Server Profiler使用方法
  10. Nginx重写规则指南
  11. c语言数组与指针编程源码,C语言编程(练习9:数组与指针)
  12. android 音频播放插件,在android中的listview中实现音频播放器
  13. 轻量级小型网站导航条
  14. 中国城市统计年鉴下载
  15. Django+Vue开发生鲜电商平台之2.开发环境搭建
  16. 2021年9月PMP考试新鲜出炉,如何查询成绩?
  17. js过滤对象中值为空的属性
  18. 基于 Qt5 ( C++ ) 开发的一个小巧精美的本地音乐播放器
  19. 2022年全国最新消防设施操作员(初级消防设施操作员)题库及答案
  20. 深富策略:周期股反弹有限 新能源是主基调

热门文章

  1. 只使用了符号的Ruby程序
  2. J2EE搭建Dynamic web SpringMVC工程404错误分析(一)
  3. 梯度提升树(GBDT)相关知识
  4. WebAPI(part9)--下拉菜单及留言案例
  5. Django从理论到实战(part35)--QuerySetAPI
  6. [转载]sql(hive)中变量的使用
  7. python print换行_Python中九九乘法表与古诗对话机器人及sep-end值
  8. ensp启动设备蓝屏_Windows 10系统遇到蓝屏怎么解决?
  9. 这个神奇的库,可以将数据平滑化并找到异常点
  10. 使用 Chrome 开发者工具分析内存问题