javascript - 是否可以将构造函数作为类中的方法?

标签 javascript class constructor

在下面的示例中,创建新节点(此处名为 Node)的构造函数位于其方法调用它的类的外部:

class Collection {

  constructor() {
    this.collection = [];
  };

  addNode(value) {
    const node = new Node(value);
    this.collection.push(node);
    console.log(this.collection);
  };
};

function Node(value) {
  this.value = value;
}

const col = new Collection();

col.addNode("foo");

但是,我希望在类中包含构造函数(主要是因为它仅由该类使用)。这将失败(x 不是构造函数):

class Collection {

  constructor() {
    this.collection = [];
  };

  Node(value) {
    this.value = value;
  };

  addNode(value) {
    const node = new this.Node(value);
    this.collection.push(node);
    console.log(this.collection);
  };
};

const col = new Collection();

col.addNode("foo");

我还知道 Javascript 目前不支持嵌套类。我当前正在做的只是在 addNode 方法中声明 Node 构造函数。

但我很好奇:在调用它的类之外是否可以有这样的构造函数?

最佳答案

选项 1:将 Node 定义为实例字段并将其设置为函数(基本上是您的第一个示例)

class Collection {

  constructor() {
    this.collection = [];
  };

  Node = function (value) {
    this.value = value;
  };

  addNode(value) {
    const node = new this.Node(value);
    this.collection.push(node);
    console.log(this.collection);
  };
};

const col = new Collection();

col.addNode("foo");

选项 2:使用嵌套类(也是实例字段)

class Collection {

  constructor() {
    this.collection = [];
  };

  Node = class Node {
    constructor (value) {
      this.value = value;
    }
  }

  addNode(value) {
    const node = new this.Node(value);
    this.collection.push(node);
    console.log(this.collection);
  };
};

const col = new Collection();

col.addNode("foo");

选项 3:使用上述任一方法,但将其设为静态字段(推荐)。这样就不会为您创建的每个 Collection 实例重新创建该类。

class Collection {

  constructor() {
    this.collection = [];
  };

  static Node = function (value) {
    this.value = value;
  };

  addNode(value) {
    const node = new Collection.Node(value);
    this.collection.push(node);
    console.log(this.collection);
  };
};

const col = new Collection();

col.addNode("foo");

关于javascript - 是否可以将构造函数作为类中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74176570/

相关文章:

javascript - 如何使用 Threejs 在 2D 中渲染字母表

javascript - 更改 qdialog 中是-否按钮的标题

javascript - DIVs点击事件错误触发其他DIVs点击事件

c++ - 没有名称的模板类

java - Java中的重叠对象

java - 使用构造函数创建基于参数化父类(super class)的生成器

javascript - 如何循环遍历 ReactJS 组件中的所有元素?

python - 当您在列表中调用 `append` 时会发生什么?

c++ - 未调用构造函数

java - 默认 java 构造函数