在重构我的东西时我遇到了一个小问题...
问题:
我有一个包含1.1k行和约10个方法的Class文件
我想做的事情(tl; dr):
将每个方法外包到其自己的文件module.export中,有一个需要所有这些方法的帮助器方法/文件,让我的类仅导入该帮助器文件,并将所有方法添加回我的类中,以便class.method调用它们正确地
我想做的事(有一点额外的花费)
好的-状态是这个...我有课
myclass.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
}
我想拥有的东西
methodOne.js
module.exports.methodOne = () => {
console.log(this.a)
99 more lines of Code
}
methodTwo.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
myclass.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:我可能可以使每个方法成为其自己的类,然后对其进行扩展,扩展和扩展...但是由于我希望将每个方法都包含在其自己的文件中(我知道这是一个样式问题,但是but) ,我真的不想走那条路...
我仍在考虑在方法的module.exports端是否做错了什么。如果我这样做了,我绝对没有头绪:D
答案 0 :(得分:1)
此方法有效,但arrow functions don't bind this
and arguments
有效,因此它无法访问this.a
或this.b
而且,您的MyClass
中有一个错字,就是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