【问题标题】:Google Chrome - Watch when javascript object property changes [duplicate]谷歌浏览器 - 当 javascript 对象属性发生变化时观察 [重复]
【发布时间】:2017-03-20 01:04:09
【问题描述】:

我有一个名为

的 JavaScript 变量
var someProperty;

在线,假设10000(它是一个巨大的js文件),我有一个函数

function updateTime() {
     console.log(someProperty.time); //i actually get an value here
}

我想找出更改属性值的函数我尝试直接在该 var someProperty 上使用 Chrome 开发工具设置断点,但收到的值为“未定义” - 这让我相信一个函数正在设置这个变量。如何查找或查看此 someProperty.time 属性的设置位置?

【问题讨论】:

标签: javascript google-chrome


【解决方案1】:

这是一个可能的解决方案

var someProp = {
  time: 'give me'
};

Object.defineProperty(someProp, 'time', {
  set: function(time) {
    this.__time = time
    console.log('Method1: Getting time from:',arguments.callee.caller)
  },
  get: function() {
    return this.__time;
  }
});

(function ILikeChanges() {
  someProp.time = 'changes';
})()

【讨论】:

    【解决方案2】:

    另一个现代解决方案是使用Proxy 对象来包装您的对象,这将使您能够添加侦听器以更新您的对象。

    set 函数中,我们使用console.trace 打印一个完整的堆栈跟踪,它将引导您到调用函数。

    MDN Proxy

    const watchObject = obj => new Proxy(obj, {
      set(target, key, value) {
        console.trace('set', { key, value })
        return target[key] = value
      }
    });
    // wrap the object with our proxy
    const someProperty = watchObject({ time: new Date })
    
    function setTime() {
      someProperty.time = new Date
    }
    // call the function that changes the state
    setTime()
    // look in your console for the call stack

    【讨论】:

    • 我尝试了使用arguments.callee.caller 方法的代理方法,但这是不允许的。这个解决方案真的很酷!
    • 是的,arguments.callee 出于安全考虑不鼓励使用,并且无法在严格模式下工作。不幸的是,Proxy 在 IE 中不可用,因此它需要代理 shim 才能工作。
    • 但是如果某些未知代码正在更改属性,您将如何告诉它使用代理?
    • @torazaburo 只需替换对象someProperty = someObject 并确保它具有所有先前的字段。
    • 我认为set 应该总是返回true
    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    相关资源
    最近更新 更多