javascript - 将导出的方法要求到类中的正确方法(原型?)
问题描述
我在重构我的东西时遇到了一个小问题......
问题:
我有一个包含 1.1k 行和 ~10 个方法的类文件
我想做什么(tl;博士):
将每个方法外包到它自己的文件中,module.export 它们,有一个需要所有方法的帮助方法/文件,让我的类只导入这个帮助文件并将所有方法添加回我的类,以便 class.method 正确调用它们。
我想做的事(有一点额外的)
Aight - 状态是这样...我有课
我的类.js
class MyClass{
constructor(a,b){
this.a = a
this.b = b
}
methodOne(){
console.log(this.a)
*100 lines of code*
}
methodTwo(){
*100 lines of code*
}
methodThree(){
*100 lines of code*
}
.... and so on
}
我想拥有的:
方法一.js
module.exports.methodOne = () => {
console.log(this.a)
99 more lines of Code
}
方法二.js
module.exports.methodTwo = () => {
100 lines of Code
}
...等等
functions_injector.js - 长度有点伪
const fs = require('fs')
const functions = {}
const functionsInjector = () => {
fs.readDir('./functions/', (err, files) => {
files.each((fileName) => {
functions[fileName.split('.')[0]] = require('./functions/'+fileName)
}
}
functionsInjector()
module.exports = functions
我的类.js
const functions = require('./functions_injector')
class MyClass {
constructor(a,b) {
this.a = a
this.b = b
}
}
const funcNames = Object.keys(functions)
const funcs = Object.values(functions)
funcNames.forEach((funcName, idx) => {
MyClass.prototype[funcName] = funcs[idx]
}
const tryMe = new MyClass('a', 'b)
const plsWork = tryMe.methodOne()
console.log(plsWork)
预期:'a'
可悲的是,现实是:未定义
通过在 methodOne.js 中调用 console.log(this) 进行更深入的挖掘会返回 {methodOne: [Function]) 这有点道理。但是由于这是通过调用
const tryMe = new MyClass()
tryMe.methodOne()
我至少可以确认,我可以通过类访问方法,现在他们只需要访问相同的this
代码稍微简化了一点。真正的代码是完全异步/等待之类的,但我不想用更多代码来打扰你。
注入器的构造并将其传递给 myClass 正在工作,我可以访问 {name:function} 对的对象.. 我需要的只是一点提示,如何以它们的方式将方法添加到我的类中'是类的方法。
非常感谢任何帮助!干杯
PS:我可能可以使每个方法成为自己的类并扩展和扩展和扩展......但是因为我想在它自己的文件中拥有每个方法(我知道这是一个风格问题,但是嗯),我真的不想走那条路...
我仍在考虑是否在方法的 module.exports 方面做错了什么。如果我这样做了,我绝对没有任何线索:D
解决方案
此方法有效,但箭头函数不绑定this
,arguments
因此无法访问this.a
orthis.b
并且,您的MyClass
it's中有错字constructor
。
简单的概念证明:简单的代码示例:
const methodOne = function () {
console.log(this.a);
}
class MyClass {
constructor(a, b) {
this.a = a;
this.b = b;
}
m2() {
console.log(this.b);
}
}
MyClass.prototype.methodOne = methodOne;
const tryMe = new MyClass('I work', 'I work too');
tryMe.methodOne()
tryMe.m2();
输出:
I work
I work too
推荐阅读
- python - Flask Python 中的动态绘图可视化(或图像)
- c# - 在c#中添加winform用户控件事件
- javascript - 使用 HTML 中的 JS 自动调整文本大小以适应图像容器
- django - 如何将我的 Web 应用程序的本地数据库同步到我部署的 Web 应用程序的数据库?
- firewall - 如何创建允许我制定基于应用程序的规则的防火墙?
- python - 使用Python密码保护xlsx Excel文件
- java - 为什么从 ProductDetailsActivity 切换到 HomeActivity 时,LoginActivity 中会出现 toast?
- google-sheets - 数据工作室过滤器 - 一些字符串数据自动转换为日期范围
- debugging - 使用单 GPU 和 Visual Studio 进行 Cuda 调试
- javascript - 如何在打开随机播放的情况下跳到下一首歌曲?反应原生