Javascript 你能检查一个对象是否被XPConnect(Firefox)包装吗?
我的设想: 我在窗口对象上迭代,试图只检索用户定义的变量/函数,并过滤掉本机浏览器对象Javascript 你能检查一个对象是否被XPConnect(Firefox)包装吗?,javascript,firefox,xpcom,Javascript,Firefox,Xpcom,我的设想: 我在窗口对象上迭代,试图只检索用户定义的变量/函数,并过滤掉本机浏览器对象 for(var i in window) { // Right now I just have a bunch of if checks on window[i] } 我注意到本机浏览器对象/XPCOM组件是通过XPConnect包装的,XPConnect返回一个对象包装器,允许它与Javascript接口。我在想,如果我能以某种方式检查这个对象是否是一个包装器,那么我就可以过滤掉它。 有没有办法检
for(var i in window) {
// Right now I just have a bunch of if checks on window[i]
}
我注意到本机浏览器对象/XPCOM组件是通过XPConnect包装的,XPConnect返回一个对象包装器,允许它与Javascript接口。我在想,如果我能以某种方式检查这个对象是否是一个包装器,那么我就可以过滤掉它。
有没有办法检查对象是否通过XPConnect包装?我想筛选出作为此处列出的任何包装类型包装的所有对象:
您可以检测XPCWrappedNative,因为
x instanceof Components.interfaces.nsistups
返回true。但是,对于DOM节点、文档、窗口等,这也会返回true。如果这不是您想要的,那么对于大多数DOM对象,后续的x.QueryInterface(Components.interfaces.nsiclasinfo)
应该会成功
除非底层JS对象公开wrappedJSObject属性,否则无法检测XPCWrappedJS。(实际上,你并不知道XPCWRADDJS对象本身,因为这是C++对象,但是该对象然后可以作为一个XPCWRADEDATA原生传递回JS)
您可以使用x==XPCNativeWrapper(x)
检测XPCNativeWrapper。当然,底层对象本身将是XPCWrappedNative
您无法真正检测到XPCSafeJSObjectWrapper,您只需要知道,如果您为内容对象打开XPCNativeWrapper,那么您将得到一个XPCSafeJSObjectWrapper。为什么不检查是否存在名为
wrappedJSObject
的属性,该属性会暴露哪些被包装的对象?如果它像鸭子一样嘎嘎叫