Javascript 查找脚本范围中定义的所有类
我得到了一堆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
<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())
}
});