如何在JavaScript模块中获取所有本地定义的对象?
问题解决:ES模块中遍历声明的对象
首先明确:你原来的方法行不通,因为ES模块(type="module"的script)的顶层this是undefined,而且你用const声明的这些变量属于模块私有作用域,不会挂载到任何全局对象或this上,自然没法通过Object.getOwnPropertyNames(this)拿到它们。
要实现遍历这些对象,推荐两种方案:
方案1:统一封装到父对象(推荐)
把所有需要遍历的对象放到一个父对象里,直接遍历这个父对象的属性即可,这是最清晰、最安全的方式:
<script type="module"> const moduleObjects = { _Tasks: {}, _client: {}, _client_simple: {}, _status: {}, _status_simple: {} }; // 遍历所有对象 for (const [name, obj] of Object.entries(moduleObjects)) { console.log(`对象名:${name},内容:`, obj); } </script>
方案2:手动枚举变量名(不推荐,仅作备选)
如果不想修改原有变量的声明方式,可以手动列出所有变量名,再通过eval获取对应值(注意:eval存在安全风险,仅在确定变量名安全的场景下使用):
<script type="module"> const _Tasks = {}; const _client = {}; const _client_simple = {}; const _status = {}; const _status_simple = {}; // 手动列出要遍历的变量名 const targetVars = ['_Tasks', '_client', '_client_simple', '_status', '_status_simple']; targetVars.forEach(varName => { const obj = eval(varName); console.log(`对象名:${varName},内容:`, obj); }); </script>
补充说明
ES模块的设计核心就是隔离作用域,顶层变量默认不会暴露到全局,所以没有原生方法可以直接枚举模块内所有声明的变量——除非你主动把它们聚合到一个容器里,这也是方案1被优先推荐的原因。
内容的提问来源于stack exchange,提问作者Dejan Dozet
相关产品推荐
相关产品推荐

