繁体   English   中英

导出 class object 的 NodeJS 行为

[英]NodeJS behavior of exporting class object

我试图了解导出 class object 而不是 class 名称的行为。 请帮助我理解。 例子

class Util {
  method() {
    return "method";
  }
}

module.exports = new Util();

然后像这样导入它

import Util from 'Util';

导出 class 将允许您在require / import它的任何其他模块上使用new创建新实例。

import MyModule from 'module';

// when exporting class:
const mdl = new MyModule();

console.log(mdl.constructor === MyModule); // => true
console.log(mdl.myValue); // => 'test'
console.log(MyModule.myValue); // => undefined

导出实例只会导出一个 object,它以 class 作为原型。 模块缓存/解析将确保返回相同的 object,并且在从不同模块重新导入时不会重新计算该值。

import MyModule from 'module';

// when exporting instance
const mdl = new MyModule(); // TypeError: MyModule is not a constructor
console.log(MyModule.myValue); // => 'test'

我想了解,object 会被创建多少次?

一次,在正常情况下。 模块被加载和缓存,如果它们被多个其他模块导入,这些模块都会看到执行导出的模块的相同实例。

使用 CJS 模块时,缓存是require.cache ,您可以通过从require.cache object 中删除模块的属性来从缓存中清除模块,这意味着它会在下一次被require 'd 时重新加载。 (我认为使用 ESM 模块不可能做到这一点。)


注意:您正在混合CJS ( module.exports =... ) 和ESM ( import )。 我建议您选择一个并始终如一地使用它,尤其是因为您不能使用require来导入 ESM 模块

首先,class 语法只是构造函数之上的糖。

如果您导出Util “类”,那么您所公开的是构造函数 function 与new Util()语法一起使用。 正确的?

另一方面,如果您导出new Util() ,而不是导出构造函数 function 或“类”,则本质上是公开了一个基于该构造函数原型 ZA8CFDE6331BD59EB66AC96F8911 构造的 object (原型)。

暂无
暂无

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

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