gpt4 book ai didi

javascript - 你能检查一个对象是否被 XPConnect (Firefox) 包裹了吗?

转载 作者:行者123 更新时间:2023-11-29 18:33:48 35 4
gpt4 key购买 nike

我的场景:我正在遍历窗口对象并尝试仅检索用户定义的变量/函数并过滤掉 native 浏览器对象。

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

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

最佳答案

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

除非底层 JS 对象公开 wrappedJSObject 属性,否则您无法检测到 XPCWrappedJS。 (您实际上看不到 XPCWrappedJS 对象本身,因为它是一个 C++ 对象,但该对象随后可以作为 XPCWrappedNative 传递回 JS。)

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

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

关于javascript - 你能检查一个对象是否被 XPConnect (Firefox) 包裹了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5342289/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com