Как определить функцию класса в другом файле Javascript с помощью Node require?

#javascript #node.js

#javascript #node.js

Вопрос:

Допустим, у меня есть класс, A определенный в его собственном файле JavaScript, вот так:

A.js

 class A {
    constructor() {
        // blah blah blah
    }
    func() {
        // a long function
    }
}
  

Если у меня есть функция (например, func() ), которую я хочу содержать в ее собственном файле (для организационных целей), как бы я это выполнил?

Я хочу что-то вроде этого:

A.js

 class A {
    constructor() {
        this.func = {};
    }
} exports.A = A;
  

ADefinition.js

 var A = require('./A.js');
A.func = () => {
    // a long function
}
  

Это, очевидно, не работает, но как бы этого добиться?

Комментарии:

1. Просто добавьте функцию в прототип.

2. просто чтобы убедиться, что я это понимаю, я бы сделал A.prototype. func = () => {}?

Ответ №1:

Классы — это в основном просто синтаксический сахар. В ES5 вы определяете функции прототипа, присваивая прототипу:

 function A() {
}
A.prototype.func = function() {
}
  

Классы могут работать одинаково:

 var A = require('./A.js');
A.prototype.func = () => {
    // a long function
}
  

Хотя, обратите внимание, что если вы используете функцию со стрелкой, у вас не будет доступа к экземпляру — вместо этого вам вполне может понадобиться полноценная функция:

 A.prototype.func = function() {
    // a long function
};
  

Кроме того, лично я думаю, что предпочел бы поместить func в class рядом с определением класса для ясности кода, а не запускать модуль, который выполняет побочные эффекты (как пытается сделать ваш текущий код), например:

 const func = require('./func.js');
class A {
  constructor() {
  }
}
A.prototype.func = func;
  

Комментарии:

1. Выполнение этого выдает мне следующее сообщение об ошибке: TypeError: не удается прочитать свойство ‘prototype’ undefined

2. У меня работает нормально: codesandbox.io/s/k55044o5z3 Если вы все еще используете свой код побочных эффектов, вам нужно будет назначить A сам экспорт, в противном случае A это будет просто свойство объекта , который вы экспортируете. например module.exports = A или const { a } = require('./A.js');