[英]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.