如何从 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 类实例中获取源代码位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何向 ES6 javascript 类添加 mixins?

从ES6重新认识JavaScript设计模式: 单例模式

详谈Javascript类与继承

详谈Javascript类与继承

如何在扩展类 javascript 中获取更新的对象数组

构造函数、ECMAscript(ES6)