`
JerryWang_SAP
  • 浏览: 1044305 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

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

阅读更多

我今天的工作又遇到一个难题。前端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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

 

 
 
0
0
分享到:
评论

相关推荐

    使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置

    在本文中,我们将深入探讨如何使用 `Object.defineProperty` 来追踪并定位修改特定变量的代码。 `Object.defineProperty` 的基本语法如下: ```javascript Object.defineProperty(obj, prop, descriptor) ``` - `...

    js中Object.defineProperty()方法的不详解.docx

    在JavaScript中,`Object.defineProperty()`方法是一个非常强大的工具,它允许我们精确地控制对象属性的行为。这个方法在处理数据绑定、访问控制等高级场景时尤为有用。下面将详细讲解`Object.defineProperty()`的...

    Object.defineProperty 的 IE 补丁object-defineproperty-ie-master.zip

    总的来说,`object-defineproperty-ie-master` 提供了一个关键的工具,使得开发者能够在IE浏览器中享受到`Object.defineProperty`带来的便利,增强了JavaScript代码在旧版IE上的可维护性和可扩展性。对于那些仍需...

    详谈Object.defineProperty 及实现数据双向绑定

    就是在我们访问或者修改某个对象的某个属性的时候,通过一段代码进行拦截行为,然后进行额外的操作,然后返回结果。那么vue中双向数据绑定就是一个典型的应用。 Vue2.x 是使用 Object.defindProperty(),来进行对...

    vue源码学习之Object.defineProperty 对数组监听

    Object.defineProperty() 方法是 JavaScript 中的一个方法,用于在对象上定义一个新属性或修改现有属性。该方法可以用于监听对象的变化,包括数组的变化。 在 Vue 源码学习中,Object.defineProperty 对数组监听...

    vue源码学习之Object.defineProperty对象属性监听

    本文介绍了vue源码学习之Object.defineProperty对象属性监听,分享给大家,具体如下: 参考版本 vue源码版本:0.11 相关 vue实现双向数据绑定的关键是 Object.defineProperty ,让我们先来看下这个函数。 在MDN上...

    1.(原理分析类)Object.defineProperty.rar

    - 一旦使用 `Object.defineProperty()` 定义了属性,除非再次使用此方法重新定义,否则无法通过其他方式更改其特性。 - 对于已存在的属性,如果 `configurable` 为 `false`,则不能删除或改变描述符的大多数属性。 -...

    vue用Object.defineProperty手写一个简单的双向绑定的示例

    Vue 使用 Object.defineProperty 实现简单的双向绑定 Vue 中的双向绑定是指视图层(View)和模型层(Model)之间的同步更新。使用 Object.defineProperty 可以手写一个简单的双向绑定示例。 什么是双向绑定? ...

    JavaScript的Object.defineProperty详解

    为JavaScript对象新增或者修改属性,有两种不同方式:直接使用=赋值或者使用Object.defineProperty()定义。如下: // 示例1 var obj = {}; // 直接使用=赋值 obj.a = 1; // 使用Object.defineProperty定义 Object....

    defineProperty:Object.defineProperty

    `Object.defineProperty`是JavaScript语言中的一个非常重要的方法,它允许我们对对象的属性进行精确的控制。这个方法在深入理解JavaScript对象属性特性和优化代码逻辑时具有关键作用。本文将详细探讨`Object....

    js代码-Object.defineProperty()

    在JavaScript中,`Object.defineProperty()` 是一个非常重要的方法,它允许我们精确地定义或修改对象的属性。这个方法提供了一种直接操作对象属性的方式,包括访问器(getter和setter)和数据属性描述符,这对于创建...

    js中Object.defineProperty()方法的不详解

    `Object.defineProperty()`是...`Object.defineProperty()`方法对于创建复杂的对象结构、封装私有变量和方法、以及实现数据绑定等高级功能非常有用。理解并熟练掌握这个方法,能让你的JavaScript编程更加灵活和高效。

    ie6 ie7 ff浏览器兼容

    为了更好地理解上述代码片段中的兼容性技巧,我们将逐一分析每一条CSS规则及其背后的原理: 1. **标准写法**: ```css border:2px solid #00f; ``` 这是标准的CSS写法,用于设置元素的边框宽度为2像素,边框...

    Vue-Object.defineProperty:Vue源码解析之手写Vue源码-源码解析

    现在前端面试Vue中都会问到响应式原理以及如何实现的,如果你还只是简单回答通过Object.defineProperty()来劫持属性可能已经不够了。 本篇文章通过学习文档及视频教程实现手写一个简易的Vue原始码实现数据双向绑定...

    define-properties:一次定义多个不可枚举的属性。 使用`Object.defineProperty`(如果可用); 退回旧发动机的标准配置

    使用Object.defineProperty如果可用); 退回旧发动机的标准配置。 现有属性不会被覆盖。 接受属性名称映射到谓词,该谓词为true时将强制覆盖。例子var define = require ( 'define-properties' ) ;var assert = ...

    使用Object.defineProperty实现简单的js双向绑定

    Object.defineProperty是ECMAScript5.1中的一个API,它允许精确地添加或修改对象的属性,并通过特定的特性描述来控制属性行为。该方法接受三个参数:目标对象、属性名、属性描述符。属性描述符是一个对象,包含属性...

Global site tag (gtag.js) - Google Analytics