要求将导出的方法导入类的正确方法(原型?)

时间:2019-10-07 14:22:23

标签: javascript node.js class ecmascript-6 module

在重构我的东西时我遇到了一个小问题...

问题:

我有一个包含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

1 个答案:

答案 0 :(得分:1)

此方法有效,但arrow functions don't bind this and arguments有效,因此它无法访问this.athis.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