如何从 ES6 JavaScript 类实例中获取源代码位置?
Posted
技术标签:
【中文标题】如何从 ES6 JavaScript 类实例中获取源代码位置?【英文标题】:How to get source code location from ES6 JavaScript class instance? 【发布时间】:2019-09-08 21:16:02 【问题描述】:我想从我的对象树中生成一些代码。为了生成所需的导入语句,我需要从类实例中找出给定类的源代码位置。
我已经能够使用
获得预期的名称MyClass
var name = instance.constructor.name;
但不是源代码位置
'/src/package/myClass.js'
=>怎么做?
对于 Java,它会像这里描述的那样工作:
Find where java class is loaded from
如果我使用 dir(constructor) 检查 Chrome 开发者工具中的构造函数,我可以看到一些属性
[[FunctionLocation]]: myClass.js:3
如果我将鼠标悬停在它上面,我可以看到想要的路径。如何以编程方式获取该属性?
编辑
刚刚发现[[FunctionLocation]]无法访问:
Access function location programmatically
【问题讨论】:
签出source maps 以防万一您还不知道,尽管有class
关键字和相关语法,但意识到JS 实际上没有“类”可以省去一些麻烦。 (MDN 解释:developer.mozilla.org/en-US/docs/Web/javascript/…)。
【参考方案1】:
document.currentScript 适用于除 IE 以外的所有浏览器。你可以这样使用它:
var script = document.currentScript;
var fullUrl = script.src;
【讨论】:
+1 --如果您需要进一步的浏览器支持,您可能需要检查这个问题:***.com/questions/2255689/… document.currentScript 在 Chrome 上对我来说是空的。我猜这不适用于 ES6 类/模块? 它不适用于异步代码。不确定模块。 @Stefan 你在哪里打电话?它应该可以工作。 来自某个 ES6 模块。【参考方案2】:一种可能的解决方法似乎是调用
determineImportLocation()
var stack = new Error().stack;
var lastLine = stack.split('\n').pop();
var startIndex = lastLine.indexOf('/src/');
var endIndex = lastLine.indexOf('.js:') + 3;
return '.' + lastLine.substring(startIndex, endIndex);
在MyClass
的构造函数中并存储起来供以后访问:
constructor(name)
this.name = name;
if(!this.constructor.importLocation)
this.constructor.importLocation = this.determineImportLocation();
然而,这需要修改我想要import
的所有类。如果有不需要修改类本身的解决方案,请告诉我。
【讨论】:
以上是关于如何从 ES6 JavaScript 类实例中获取源代码位置?的主要内容,如果未能解决你的问题,请参考以下文章