有没有更简单的方法从 class 中引用 Javascript class 方法?

Is there an easier way to refer to Javascript class methods from within the class?

我没有 javascript 编码背景,我习惯做的一件事是将代码封装在 class.

所以我有一个 class 文件并且它可以工作,但是对 this. 的不断引用缺乏某种 优雅 这让我觉得我是以错误的方式做事。特别是当我尝试从方法中的代码“级别”内引用 this. 并且我必须在局部变量中携带引用以使其工作时。

下面是我所拥有的示例

class catalogue {

    constructor () {

        this.currentDoc = null;
        this.dataDirectory = "data/";

    }
    
    loadJSON(filepath) {
        // there is actual code in the real class
    }
    
    loadHTML(filePath) {
        // there is actual code in the real class
    }
    
    loadExternalData() {

        let filePath = `${this.dataDirectory}${this.currentDoc.filepath}`;
        let dataIsJson = this.currentDoc.filepath.indexOf('.json') != -1;

        let me = this; // this again :-(
        
        if (dataIsJson) {
            me.loadJSON(filePath);
        } else {
            me.loadHTML(filePath);
        }

    }
    
}

从创建 class 实例的代码调用 loadExternalData() 方法。然后确定如何加载所需的数据,并根据数据类型调用各种方法。

回到 'old days' 时,我会将对 class 的引用存储为 class 的 属性,然后使用它来调用方法。主要问题是,正如我们所知,this. 是上下文相关的,一旦您使用条件或任何类似上下文的内容,由于某些奇怪的原因,更改和 this. 对我的 class 了。

所以所有这些让我觉得我没有按照 Javascripty 的方式做事。

是否有更简单的方法来引用方法和属性而不使用 this. 或者我是否需要重新编写代码?

你所做的是完全正常和普遍的。如果你担心什么:

The main problem is that, as we know, this. is contextual and as soon as you use a conditional or anything similar the context, for some bizarre reason, changes and this. is not useful to my class any more.

一个非常简单的调整是使用箭头函数 class 字段来代替,这样 this 将始终引用实例,而不必担心调用上下文的变化。

class catalogue {
    constructor () {

        this.currentDoc = null;
        this.dataDirectory = "data/";
    }
    loadJSON = (filepath) => {
        // there is actual code in the real class
    }
    loadHTML = (filePath) => {
        // there is actual code in the real class
    }
    loadExternalData = () =>  {
        let filePath = `${this.dataDirectory}${this.currentDoc.filepath}`;
        let dataIsJson = this.currentDoc.filepath.indexOf('.json') != -1;
        if (dataIsJson) {
            this.loadJSON(filePath);
        } else {
            this.loadHTML(filePath);
        }

    }
    
}

Is there an easier way to refer to methods and properties without using this

不特别,但我想如果函数正确绑定到 this,您也可以先将它们提取到独立变量中,也许在函数的第一行。 IMO 这不是改进,而是 YMMV。例如

    loadExternalData() {
        let filePath = `${this.dataDirectory}${this.currentDoc.filepath}`;
        let dataIsJson = this.currentDoc.filepath.indexOf('.json') != -1;

可以更改为

    loadExternalData() {
        const { dataDirectory, currentDoc } = this;
        let filePath = `${dataDirectory}${currentDoc.filepath}`;
        let dataIsJson = currentDoc.filepath.indexOf('.json') != -1;

也可以将最后一行更改为

const dataIsJson = currentDoc.filePath.endsWith('.json');

准确地说。