【问题标题】:Nodejs: Referencing constructor variables from instance variablesNodejs:从实例变量中引用构造函数变量
【发布时间】:2021-05-09 20:44:22
【问题描述】:

我在 Javascript(节点)中有一点 OOP 问题。

我创建了一个名为 Bubble 的类。这个类有一个接受令牌的构造函数。现在,问题来了:

class Bubble {
    
    constructor(token) {
        if (!token) throw new Error('No token');
        this.token = token;
    }

    first = new First(this.token)
    second = new Second(this.token)
    third = new Third(this.token)

如果我执行new Bubble("someToken").first,则会传递一个 null 令牌。但是,如果我将 firstsecondthird 更改为函数并执行new Bubble("someToken").first(),则可以成功传递确切的令牌。我想引用 firstsecondthird 作为直接变量,而不是函数,即 new Bubble("someToken").first

我该怎么做?

【问题讨论】:

  • new Bubble("someToken").first() 是什么?
  • 这些行应该在构造函数中并以this:this.first = new First(this.token)等开头
  • 什么是第一/第二/第三?你能发布语法正确的代码吗?
  • 谢谢,@georg。这工作得很好。您能否将此作为答案发布,以指导将来可能遇到此问题的人?
  • @TaslimOseni:完成....

标签: javascript node.js oop


【解决方案1】:

一种选择是将您的类方法实现为getters。以下是您的示例中的样子:

class Bubble {
    
    constructor(token) {
        if (!token) throw new Error('No token');
        this.token = token;
    }
    
    get first() {
      return new First(this.token);
    }
    
    get second() {
      return new Second(this.token);
    }

    get third() {
      return new Third(this.token);
    }   
}

有了这些 getter,访问它们看起来就像调用者的常规属性访问。

const bubble = new Bubble("token");
bubble.first
bubble.second
bubble.third

【讨论】:

  • 这是有道理的。谢谢你。
【解决方案2】:

您的代码使用public class fields,尽管几乎在所有地方都受支持,但它仍然不是标准的一部分。问题是,字段初始化器在构造函数之前执行,无论它们在文本上位于何处:

class A {
    field1 = console.log('field initializer 1')

    constructor() {
        console.log('constructor')
    }

    field2 = console.log('field initializer 2')
}

new A

因此,在first = new First(this.token) 中,token 尚未定义。一种解决方法是将类字段转换为“普通”属性,在构造函数中初始化:

class Bubble {
    constructor(token) {
        if (!token) throw new Error('No token');
        this.token = token;
        this.first = new First(this.token)
        ....etc
    }

【讨论】:

  • 工作就像一个魅力!谢谢。
  • 这不是“解决方法”,它是创建具有依赖于构造函数参数的值的属性的唯一正确解决方案。
猜你喜欢
  • 2010-11-26
  • 2014-01-12
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 2013-08-04
相关资源
最近更新 更多