• 热门专题

Object.defineProperty让你巧妙找到修改变量的准确位置

作者:whl  发布日期:2018-11-03 08:30:00
Tag标签:Object  defineProperty  
  •   Object.defineProperty() 方法就是直接在一个对象上定义一个新属性,或者是修改一个已经存在的属性, 并返回这个对象。相信广大的电脑用户都想通过使用Object.defineProperty来实现修改某个变量的准确代码位置的相关内容,但是却苦于没有行之有效的学习方法。。下面这篇文章主将会给大家细细解答,需要的朋友们可以认真参详。

      前言

      1、语法

      Object.defineProperty(obj, prop, descriptor)

      2、参数

      obj 需要定义属性的对象。

      prop 需被定义或修改的属性名。

      descripter 需被定义或修改的属性的描述符。

      3、发现问题

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

    禁用

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

    调试

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

    属性

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

      4、解决方法

      于是我只有寻求其他办法。我想到了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的代码位置。

    触发
    触发

      以上内容就是今天给大家分享的我在Object.defineProperty的使用过程中发现的一些对于大家的学习来说非常具有价值的东西。希望大家通过学习能够操作自如,达到自己目的,那么也就不会白费我这一次分享了。

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规