我的情景: 我正在迭代窗口对象并尝试仅检索用户定义的变量/函数并过滤掉本机浏览器对象。
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
答案 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
的属性是否存在?如果它像鸭子一样嘎嘎叫......