2015-09-28 45 views
0

我正在为我的Chrome扩展程序编写一些代码以将某些脚本注入某个页面。在JavaScript中,是否有一个事件来检查变量名是否刚创建?

我想在window对象中创建对象后立即更改属性值。

是否有事件来检查属性是否已添加到对象?

+1

@ DanielA.White赋值表达式创建属性,这只会工作 - 这难道不是对DOM的变化,而不是变量的变化? – Quentin

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe –

回答

3

怎么样对您正在搜索的窗口对象的属性创建setter方法?

查核在此小提琴的代码:http://jsfiddle.net/j6jagzan/1/

Object.defineProperty(window, "myprop", 
    (function() { 
    var prop; 
     return { 
      configurable: true, 
      enumerable: true, 
      get: function() { 
       return prop; 
      }, 
      set: function(value) { 
       console.log("object has been set to " + value); 
       //Your code here 
       prop = value; 
      } 
     } 
    })() 
); 

//Set the global property 
myprop = 3; 

它使用一个“立即调用的函数表达式”(IIFE)与属性的值存储在一个闭合。

当然,如果是像prop = valuewindow["prop"] = value

+0

** @ the_tiger **你的答案是最好的^^这就是我现在需要的。因为我知道变量名,所以我可以在你的代码中使用'set:function(){}'来改变它的值。非常感谢!!! –

+0

很好的答案。但我不得不说,这和@昆汀的一样,而且是在后面。 –

+0

@TrầnQuốcHoàinew2015我很高兴我能帮到你:) –

0

据我所知,没有一个事件检查是否创建了一个变量名。

你可以做什么,是使用间隔来检查一个变量,然后一旦它被定义,就做一些事情。这里是一些伪代码:

setInterval(function() { 
    if (theVariable !== 'undefined') 
    // yay, it's been defined! 
}, 1000) 
+0

谢谢** sircapsalot **,但如果我们检查每一个不好的,因为我想在创建后更改变量的值,页面将为页面中下一行代码使用新值。因为下一行需要新的值,请立即更改并应用。所以在1s中,我认为页面中的所有代码都被执行了。但是如果我们改变时间较短,页面就会崩溃。 –

+0

@sircapsalot - 不正确。浏览器强制执行最小延迟。即使情况并非如此,他们仍然不会中断另一个运行事件处理程序的函数。 – Quentin

+0

删除了关于@Quentin最小延迟的评论。不知道 – sircapsalot

2

不,没有。

如果你需要这个,那么你最好使用带setter函数的对象。

var o = { 
 
    set myValue(str) { 
 
     this._str = str; 
 
     alert(str); 
 
    }, 
 
    get myValue() { 
 
     return this._str; 
 
    } 
 
} 
 

 
o.myValue = "Hello"; 
 
document.body.innerHTML = o.myValue;

+0

对不起,因为页面是创建变量的主机,我没有权利改变他如何创建变量的方式。所以目前这种方式对我来说并不好。 –

1

Object.observe() API是你在找什么。在撰写本文时,这是一项实验技术,是ECMAScript 2016(ES7)提案的一部分。

在此期间,您可以使用observe-js,这将在可用时利用Object.observe()

你可以使用一个PathObserver观察只是财产你有兴趣(例如window.myProperty):

var observer = new PathObserver(window, 'myProperty'); 
observer.open(function(newValue, oldValue) { 
    // respond to window.myProperty having changed value. 
}); 
+0

谢谢** Andrea Casaccia **这么多,但也许你是对的,我已经测试过了,表现是一件很重要的事情。我看到** the_tiger **的Object.defineProperty对这个问题来说太好了。我们应该学习它。 –

+0

这是真的@TrầnQuốcHoàinew2015其他答案更简单,并且适用于此问题。 –

相关问题