监视属性创建事件?
监视属性创建事件?
我需要能够确定一个对象何时被创建(不是DOM元素,而是JavaScript对象)。\n这个问题的答案中有一些看起来非常有用的代码,用于创建可观察的属性,这样当属性发生变化时,可以触发一个函数。\n在我的情况下,我需要在对象/属性被创建时执行某些操作,而不是现有属性发生变化,对于这个问题,我的有限理解并没有帮助我弄清楚是否可以使用那些代码来实现这个目标,我已经仔细研究了很久。\n情况是这样的:页面加载了一堆脚本。其中一些脚本创建了其他脚本需要的东西,例如:\n
ThisStuff = (function () { // blah blah return self; } ());
\n其他一些代码需要在ThisStuff
可用时进行初始化,这可能是在DOM加载完成之后。用户实际上不需要立即使用ThisStuff
,所以它可以在脚本加载完成后随时发生。所以我想做的是:\n
$(document).ready(function() { wheneverIsAvailable(window,'ThisStuff', function(object) { object.init(args); }) });
\n我意识到解决这个问题还有其他方法(改变脚本顺序或按需加载脚本),但由于架构的原因,这些方法都很困难。所以我只对解决这个问题的方法感兴趣,而不是其他解决方案。如果jQuery提供了这样的功能,那也可以,因为我正在使用它。
问题的原因是想要在特定变量被创建时触发一个函数,但是没有直接的方法可以实现。解决方法是使用setInterval
函数设置一个定时器,检查变量是否被创建,并使用obj.hasOwnProperty(prop)
方法进行检查。当变量被创建时,调用函数并清除定时器。
以下是实现上述解决方法的代码示例:
window.__intervals = []; function wheneverIsAvailable(obj, prop, func) { var id = (Math.random()+"").substring(2); var args = arguments; window.__intervals[id] = window.setInterval(function() { if(obj.hasOwnProperty(prop)) { window.clearInterval(window.__intervals[id]); func(Array.prototype.slice.call(args, 3)); // Call function with additional parameters passed // after func (from index 3 and on) } }, 1000/ 50); } wheneverIsAvailable(window, 'test', function() { alert(arguments[0]); }, 'Woot!'); window.setTimeout('window.test = 123', 1000);
这段代码使用了wheneverIsAvailable
函数来监视window
对象中的test
变量是否被创建。当test
变量被创建时,弹出一个提示框显示传入的参数'Woot!'。
这个解决方法可能有些麻烦,但在大多数情况下应该能正常工作。