Node.js中多次实例化类后数据无法保留的问题及解决方法
问题原因
你当前的datas是实例属性,每次通过new Foo()(注:你调用代码里漏了new,这会直接报错,必须补上)创建新实例时,都会在构造函数里初始化一个全新的this.datas对象。foo1和foo2是两个完全独立的实例,它们的datas互不关联,所以foo2拿不到foo1存入的数据。
解决方案
要实现跨实例共享数据,需要把datas改成类级别的共享属性,有两种常用方式:
方式1:使用类静态属性
直接在Foo类中定义静态属性datas,所有实例都会共享这个属性:
class Foo { // 定义静态属性,所有Foo实例共享 static datas = {} constructor() { // 无需再初始化实例专属的datas } set(key, data) { return Foo.datas[key] = data } get(key) { return Foo.datas[key] } } module.exports = Foo
方式2:使用模块级闭包变量
在模块作用域定义一个共享的datas变量,类的方法直接操作这个变量,外部无法直接访问,安全性更高:
// 模块级变量,仅当前模块内部可访问 const datas = {} class Foo { constructor() { } set(key, data) { return datas[key] = data } get(key) { return datas[key] } } module.exports = Foo
修正调用代码
另外注意:你的调用代码里const foo1 = Foo()是错误的,类的构造函数必须用new关键字调用,否则会抛出错误,修正后的调用代码:
const Foo = require('./foo.js') // 假设你的类文件是foo.js const foo1 = new Foo() foo1.set('a', [1, 2, 3]) const foo2 = new Foo() var aData = foo2.get('a') console.log(aData) // 现在会输出 [1,2,3]
内容的提问来源于stack exchange,提问作者Ömer Faruk Demirel
相关产品推荐
相关产品推荐

