【问题标题】:How to find hidden properties/methods in Javascript objects?如何在 Javascript 对象中找到隐藏的属性/方法?
【发布时间】:2011-02-25 19:02:45
【问题描述】:

我想自动确定所有属性(包括 隐藏的)在给定的Javascript对象中,通过这个的概括 功能:

function keys(obj) {
    var ll = [];
    for(var pp in obj) {
        ll.push(pp);
    }
    return ll;
}

这适用于用户定义的对象,但对许多内置对象无效:

repl> keys({"a":10,"b":2});  // ["a","b"]
repl> keys(Math) // returns nothing!

基本上,我想编写 Python 的 dir() 和 help() 的等效函数,它们在探索新对象时非常有用。

我的理解是只有内置对象具有隐藏属性(用户代码evidently 无法设置“可枚举”属性直到 HTML5),所以一种可能性是简单地将 Math、String 等的属性硬编码到一个 dir() 等效项(使用诸如 here 之类的列表)。但是有更好的方法吗?

编辑:好的,到目前为止我看到的最佳答案是this thread。你不能用自己的 JS 代码轻松地做到这一点,但下一个最好的方法是在 Chrome 的开发者工具中使用 console.dir(Chrome -> 查看 -> 开发者 -> 开发者工具)。运行 console.dir(Math) 并单击三角形向下钻取以列出所有方法。对于大多数交互式/发现工作来说,这已经足够好了(您实际上并不需要在运行时执行此操作)。

【问题讨论】:

    标签: javascript python introspection hidden


    【解决方案1】:

    这在previous answer 中有解释。基本上,规范明确要求(使用DontEnum)这些对象不可枚举。

    【讨论】:

    • 当然。我认为该线程中的 console.dir 答案是我正在寻找的,所以感谢您指出它。
    【解决方案2】:

    ECMAScript 5th ed. 定义了Object.getOwnPropertyNames,它返回传入对象的所有属性的数组,包括不可枚举的属性。到目前为止,只有 Chrome 实现了这一点。

    Object.getOwnPropertyNames({a: 10, b: 2});
    

    给出["b", "a"](不分先后)

    Object.getOwnPropertyNames(Math);
    

    ["LN10", "PI", "E", "LOG10E", "SQRT2", "LOG2E", "SQRT1_2", "LN2", "cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"]

    【讨论】:

    • 啊哈。所以这就是 Chrome 的做法——我以为他们已经硬编码了。
    【解决方案3】:

    Object.getOwnPropertyNames 不会返回“隐藏的”。
    Object.getOwnPropertyNames 返回非继承属性的名称。

    【讨论】:

      【解决方案4】:

      这可以在 firebug 中找到对象方法。

      Object.getOwnPropertyNames(数学);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-09
        • 1970-01-01
        • 2019-06-16
        • 1970-01-01
        • 2017-07-28
        • 2020-12-13
        • 2012-01-23
        • 1970-01-01
        相关资源
        最近更新 更多