繁体   English   中英

Nodejs:不要使用导出运行“新类”

[英]Nodejs: Don't run `new class` with export

这是我的配置:

const one = new one()
const two = new two()

export default {
  one,
  two
}

这是我的课程:

export class one {
  constructor () {
    console.log("one");
  }
}

export class two {
  constructor () {
    console.log("two");
  }
}

这是我的设置:

import runner from "./";
runner.one

为什么在调用runner.one之后, runner.two也在运行?!

我只想跑runner.one

它发生在这里:

const one = new one()
const two = new two()

因为您在两个类的constructor()方法中定义了console.log

当您调用new ClassNameHere()时,它会执行constructor()

您可以简单地导出类而不是实例化它们:

跑者.mjs

export class one {
  constructor () {
    console.log("one");
  }
}

export class two {
  constructor () {
    console.log("two");
  }
}

执行器.mjs

import * as runners from "./runners";

const one = new runner.one();

或名称类 CapitalizedCamelCased:

跑者.mjs

export class RunnerOne {
  constructor () {
    console.log("one");
  }
}

export class RunnerTwo {
  constructor () {
    console.log("two");
  }
}

执行器.mjs

import {RunnerOne} from "./runners";

const one = new RunnerOne();

很高兴,因为您正在使用const说明符全局实例化它们。

执行此操作时,代码会在遇到实例化( new关键字)时立即调用每个类的构造函数。

const one = new one()
const two = new two()

export default {
  one,
  two
}

如果这不是您想要的,并且您希望它们分别初始化,则可以有多种方法来实现。

一种是在访问它们之前单独实例化它们。 (您可以在仍然需要访问实例化对象的类中的实例化对象的情况下使用它)。 像这样:

包含一和二的类:

(假设您在文件onetwo.mjs中定义您的类)

import * as ot from "./onetwo.mjs";

let one;
let two;

function instantiateOne() {
  one = new ot.one();
}

function instantiateTwo() {
  two = new ot.two();
}

export default {
  one,
  two,
  instantiateOne,  // expose methods needed to create instances
  instantiateTwo,
}

上面使用的类:

import runner from "./";

runner.instantiateOne(); // this will only create instance of 'one'

runner.one; // accessing one

当然还有其他方法,可能需要更多更改才能使其在您的项目中工作,但这是其中一种模式。 请注意,在使用这种策略时,您要么总是在使用对象( onetwo )之前检查它们是否已被实例化,要么确保在开始时就这样做。

注意:这只是给你一个想法。 这不是一个具体的实现。 如果你确实想实现这样的东西,你必须处理所有边缘情况(例如,防止重新初始化等)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM