簡體   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