0

我在全局范围内定义了一个名为global. 我想动态地在我的变量 global 下找到所有引用的属性。也就是说,在代码执行期间访问的所有属性。

我想做静态代码分析以提取变量下的所有引用属性。我可以搜索这些模式:global.PROPERTY_NAME AND global[PROPERTY_NAM]。但是,像这些复杂的情况呢?

var tmp="PROPERTY_NAME";
global[tmp]

或者

var tmp=global;
tmp.PROPERTY_NAME

和其他的?

我不想获取所有变量的属性。我只想要一个引用的列表!仅在我的源代码中引用的属性

4

2 回答 2

3

编辑后:

您正在寻找的是 JavaScript代理对象。这是有关如何使用它们执行此操作的教程。

代理对象使您可以包装对象并在访问其属性时执行方法。不幸的是,就目前而言,它们并未得到广泛支持。

这是目前在 JavaScript 中唯一能在不更改原始global对象的情况下完成此操作的方法。

您可以通过在 about:flags 选项卡中启用实验性 JavaScript 在 Chrome 中打开它们。

在您编辑之前:

您正在寻找的功能称为反射,JavaScript 原生支持它

这是一些遍历对象并获取其属性的代码

for(var prop in global){
    if(global.hasOwnProperty(prop)){ //this is to only get its properties and not its prototype's
        alert(prop+" => "+global[prop]);
    }
}

这是相当跨浏览器的。更现代的浏览器允许您以更简单的方式执行此操作,例如Object.keys(global)返回包含其所有可枚举属性的数组,或Object.getOwnPropertyNames(global)返回可枚举和不可枚举属性。

于 2013-03-01T14:36:06.940 回答
1

由于 JavaScript 的动态特性,您无法通过静态代码分析来实现。想想这样的案例:

var prop = document.getElementById('prop').value;
global[prop];

不可能的。另一种选择是动态分析,这意味着您修改全局对象以记录对其属性的访问,然后运行代码。这在 JavaScript 中很容易实现,但它也对您没有帮助,因为您如何确保您已经涵盖了所有可能的访问?尤其是在 5 MB JavaScript 中,您很可能会监督一些边缘情况。

所以,如果你不能缩小你的要求,那是不可能的。

于 2013-03-01T14:53:03.137 回答