Node.js如何像Python一样导入文件、执行逻辑并访问更新后变量
Node.js 实现与Python类导入等价功能的方案
原Python实现逻辑回顾
在Python中可在单文件内定义类,导入后完成实例化、访问实例属性、调用实例方法等操作,对应代码如下:file1.py 定义类:
class class1: def __init_(self, var1, var2): self.var3 = var1 self.var4 = var2 self.callFunction(self.var3, self.var4) def callFunction(self, classVar1, classVar2): print(classVar1) print(classVar2) def anotherFunction(self, otherVar1, otherVar2): daString = otherVar1 + otherVar2 return daString if __name__ == '__main__': class1('passing var1', 'passing var2')
导入语句:
from folder import file1 from folder.file1 import *
实例化调用示例:
newThing = file1.class1('updated self var1', 'updated self var2') # 打印实例属性 print(newThing.var3) # "updated self var1" print(newThing.var4) # "updated self var2" # 调用实例方法并打印结果 result = newThing.anotherFunction('test', '123') print(result) # test123
原有Node.js代码的错误点
Node.js完全可以实现和上述Python逻辑完全一致的效果,你的代码报错是因为3个语法规则层面的错误,和能力无关:
- 导出逻辑错误:你在
File1.js最后写的是module.exports = new Class1();,这行代码导出的是Class1的一个实例对象,不是类本身,外部执行new importClass()相当于对已经实例化的对象再次做实例化操作,必然报错。 - 类内部方法调用错误:JS类中的实例方法必须通过
this.方法名()的形式调用,直接写someFunction()时,JS会去全局作用域查找同名函数,找不到就会抛出未定义错误。 - 模块引入路径错误:
require引入本地文件必须加相对路径前缀./,直接写require('File1.js')时,Node会默认去node_modules目录查找对应模块,自然找不到本地的File1.js文件。
正确实现代码
File1.js(对应Python的file1.py)
注意导出类本身而非实例,类内部调用实例方法加this.前缀,同时实现和Pythonif __name__ == '__main__'等价的直接运行逻辑:
class Class1 { constructor(var1, var2) { this.cVar1 = var1; this.cVar2 = var2; this.extraThing = 'extra text'; // 内部调用实例方法必须加this前缀 this.someFunction(this.cVar1, this.cVar2); } someFunction(passArg1, passArg2) { console.log(passArg1 + passArg2 + this.extraThing); } anotherFunction(otherVar1, otherVar2) { return otherVar1 + otherVar2; } } // 导出类本身,不要提前实例化 module.exports = Class1; // 直接运行当前文件时执行的逻辑,对应Python的__main__判断 if (require.main === module) { new Class1('passing var1', 'passing var2'); }
File2.js(对应Python的file2.py)
引入模块时写对本地路径,实例化后即可像Python一样访问所有实例属性、调用实例方法:
// 引入本地模块必须加相对路径前缀 const Class1 = require('./File1.js'); // 实例化类,和Python实例化逻辑完全一致 const classThing = new Class1('updated self var1', 'updated self var2'); // 访问实例属性 console.log(classThing.cVar1); // 输出:updated self var1 console.log(classThing.cVar2); // 输出:updated self var2 // 调用实例方法 const result = classThing.anotherFunction('test', '123'); console.log(result); // 输出:test123
如果需要实现Python中from folder.file1 import *的直接导入效果,只需要在对应文件夹下新增index.js做转发导出即可:
// folder/index.js module.exports = require('./File1.js');
之后就可以直接通过const Class1 = require('./folder');完成导入,不需要写完整文件名。
内容的提问来源于stack exchange,提问作者j. cole
相关产品推荐
相关产品推荐

