#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');