Javascript 查找脚本范围中定义的所有类

Javascript 查找脚本范围中定义的所有类,javascript,ecmascript-6,Javascript,Ecmascript 6,我得到了一堆javascript文件,它们通过简单的 <script src ="script.js"></script> <script defer src ="anotherscript.js"></script> anotherscript.js应该能够动态查找以前定义的所有类,创建它们并逐个执行方法 不幸的是,我已经遇到了第一个问题:如何获取“在”anotherscript.js上指定的所有类的名称。我尝试了Object.getOwn

我得到了一堆javascript文件,它们通过简单的

<script src ="script.js"></script> 
<script defer src ="anotherscript.js"></script> 
anotherscript.js应该能够动态查找以前定义的所有类,创建它们并逐个执行方法

不幸的是,我已经遇到了第一个问题:如何获取“在”anotherscript.js上指定的所有类的名称。我尝试了
Object.getOwnPropertyNames(这个),它适用于函数,但不适用于类

通缉令:

function findAllClassNamesInScope() {
    // ??? should return list of classes in scope. eg ['TestPong1',  'TestPong2']
}

谢谢

您可以选择上一个
脚本
元素,使用
fetch()
请求
脚本
,解析
.text()
响应,调用
窗口。在拆分文本的结果上,eval
处的数组进行迭代,对于
循环的..,使用
new
操作符调用每个

let scripts = document.scripts;
let script = scripts[scripts.length - 2];
fetch(script.src)
.then(response => response.text())
.then(script => {
  let classes = script.split(/\s(?=class)/).map(window.eval);
  for (let fn of classes) {
    console.log(fn.name, new fn())
  }
});

plnkr

这些类是否封装在模块中?不,在我的情况下不是。浏览器加载的简单普通javascript…您是否可以选择将其包装到函数或对象中?如果是,您可以使用此包装器访问所有函数。如果没有,那就很难了。这里的主要问题似乎是,这不是你应该做的事情。如果您有多个文件中的内容,您应该使用一个模块加载器来导出一组已知的内容,或者文件应该创建自己的名称空间来进行检查,例如
window.RaNamespace.TestPong1=class TestPong1{}
,这样您就可以执行
Object.keys(window.RaNamespace)
。因此,没有“简单”了获取与Object.getOwnPropertyNames相似的所有类的方法(这是);正当我可以自己解析脚本,然后按照答案中的建议提取类名——但这需要提取两次脚本,还需要解析听起来容易出错的文件。如果我错了,请纠正我…嘿!这是个很酷的主意!你能想出更“直接”的东西吗?类似于Object.getOwnPropertyNames(这个);但是上课呢?又名“Object.getDefinedClasses(this);”或类似的..?Chain
.map(({name})=>name)
数组。
let scripts = document.scripts;
let script = scripts[scripts.length - 2];
fetch(script.src)
.then(response => response.text())
.then(script => {
  let classes = script.split(/\s(?=class)/).map(window.eval);
  for (let fn of classes) {
    console.log(fn.name, new fn())
  }
});