如何枚举运行时添加的JavaScript对象的属性/方法?

时间:2012-09-25 17:37:10

标签: javascript

场景:我正在尝试使用复杂的API来找出现有的HTML / JavaScript网站。它为window对象添加了几个属性。我只想枚举那些不是内置或默认的属性(例如,排除window.locationwindow.parent等。)

是否有惯用的JavaScript方法来执行此操作?我想过在一个空白的HTML页面中做一个浅拷贝,然后在枚举真实的那个时候以某种方式“减去”这些属性。

理想情况下,我想要一种方法将对象转储到控制台或监视器中,好像没有常规window属性存在,只有那些添加了JavaScript源。

2 个答案:

答案 0 :(得分:5)

这是我在评论中建议的详细版本:

window.preexistingkeys = [];
for (var key in window) window.preexistingkeys.push(key);

// your convoluted api here

for (var key in window) {
    if (window.preexistingkeys.indexOf(key)==-1) console.log(key, window[key]);
}
​

with a fiddle

请注意,您可以在导入外部脚本之前,在页面标题的开头执行第一部分。 Here's a sample

答案 1 :(得分:2)

扩展dystroy's answer,如果您无法在api之前执行代码,您可以动态创建一个新窗口来获取其属性(因为它将是'干净'
也使用hasOwnProperty排除继承的属性

window.preexistingkeys = [];

var w = window.open();
for (var key in w) if(window.hasOwnProperty(key)) window.preexistingkeys.push(key);
w.close();


for (var key in window) {
    if (window.hasOwnProperty(key) && window.preexistingkeys.indexOf(key)==-1) console.log(key, window[key]);
}