你可以检查一个对象是否被XPConnect(Firefox)包装?

时间:2011-03-17 16:42:41

标签: javascript firefox xpcom

我的情景: 我正在迭代窗口对象并尝试仅检索用户定义的变量/函数并过滤掉本机浏览器对象。

for(var i in window) {
    // Right now I just have a bunch of if checks on window[i]
}

我注意到本机浏览器对象/ XPCOM组件是通过XPConnect包装的,它返回一个允许它与Javascript接口的对象包装器。我在想,如果我能以某种方式检查并查看该对象是否是一个包装器,那么我可以将其过滤掉。 有没有办法检查对象是否通过XPConnect包装?我想过滤掉所有包装为此处列出的任何包装类型的对象: https://developer.mozilla.org/en/XPConnect_wrappers

2 个答案:

答案 0 :(得分:4)

您可以检测到XPCWrappedNative,因为x instanceof Components.interfaces.nsISupports返回true。但是,对于DOM节点,文档,窗口等,这也会返回true。如果这不是您想要的,那么对于大多数DOM对象,后续的x.QueryInterface(Components.interfaces.nsIClassInfo)应该会成功。

除非底层JS对象公开wrappedJSObject属性,否则无法检测到XPCWrappedJS。 (你实际上并没有看到XPCWrappedJS对象,因为那是一个C ++对象,但是那个对象可以作为XPCWrappedNative传回JS.)

您可以使用x == XPCNativeWrapper(x)检测XPCNativeWrapper。当然,底层对象本身就是一个XPCWrappedNative。

您无法真正检测到XPCSafeJSObjectWrapper,您只需要知道如果您为内容对象解包XPCNativeWrapper,那么您将获得一个XPCSafeJSObjectWrapper。

答案 1 :(得分:0)

为什么不检查包含对象公开的名为wrappedJSObject的属性是否存在?如果它像鸭子一样嘎嘎叫......