首页 > 解决方案 > 将导出的方法要求到类中的正确方法(原型?)

问题描述

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

问题:

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

标签: javascriptnode.jsclassecmascript-6module

解决方案


此方法有效,但箭头函数不绑定thisarguments因此无法访问this.aorthis.b

并且,您的MyClassit'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

推荐阅读