llamar - static class javascript
¿Cómo exportar correctamente una clase ES6 en el Nodo 4? (9)
Definí una clase en un módulo:
"use strict";
var AspectTypeModule = function() {};
module.exports = AspectTypeModule;
var AspectType = class AspectType {
// ...
};
module.export.AspectType = AspectType;
Pero recibo el siguiente mensaje de error:
TypeError: Cannot set property ''AspectType'' of undefined
at Object.<anonymous> (.../AspectType.js:30:26)
at Module._compile (module.js:434:26)
....
¿Cómo debo exportar esta clase y usarla en otro módulo? He visto otras preguntas SO, pero recibo otros mensajes de error cuando intento implementar sus soluciones.
A veces necesito declarar varias clases en un archivo, o quiero exportar clases base y mantener sus nombres exportados porque mi editor de JetBrains lo entiende mejor. Yo solo uso
global.MyClass = class MyClass { ... };
Y en otro lugar:
require(''baseclasses.js'');
class MySubclass extends MyClass() { ... }
Con ECMAScript 2015 puede exportar e importar múltiples clases como esta
class Person
{
constructor()
{
this.type = "Person";
}
}
class Animal{
constructor()
{
this.type = "Animal";
}
}
module.exports = {
Person,
Animal
};
entonces donde los usas:
const { Animal, Person } = require("classes");
const animal = new Animal();
const person = new Person();
En caso de colisiones de nombres, o si prefiere otros nombres, puede cambiarles el nombre de esta manera:
const { Animal : OtherAnimal, Person : OtherPerson} = require("./classes");
const animal = new OtherAnimal();
const person = new OtherPerson();
Si está utilizando ES6 en el Nodo 4, no puede usar la sintaxis del módulo ES6 sin un transpilador, pero los módulos CommonJS (módulos estándar del Nodo) funcionan igual.
module.export.AspectType
debiera ser
module.exports.AspectType
de ahí el mensaje de error "No se puede establecer la propiedad ''AspectType'' de undefined" porque
module.export === undefined
.
También por
var AspectType = class AspectType {
// ...
};
puedes escribir
class AspectType {
// ...
}
y obtener esencialmente el mismo comportamiento.
Simplemente lo escribo de esta manera
en el archivo AspectType:
''use strict'';
export default class ClassName {
constructor () {
}
}
e importarlo así:
class AspectType {
//blah blah
}
module.exports = AspectType;
Utilizar
// aspect-type.js
class AspectType {
}
export default AspectType;
Luego para importarlo
// some-other-file.js
import AspectType from ''./aspect-type'';
Lea http://babeljs.io/docs/learn-es2015/#modules para más detalles
Varias de las otras respuestas se acercan, pero honestamente, creo que es mejor ir con la sintaxis más limpia y simple. El OP solicitó un medio para exportar una clase en ES6 / ES2015. No creo que puedas estar mucho más limpio que esto:
const AspectType = require(''./AspectType'');
var aspectType = new AspectType;
Yo tuve el mismo problema. Lo que encontré fue que llamé a mi objeto receptor el mismo nombre que el nombre de la clase. ejemplo:
const AspectType = new AspectType();
esto arruinó las cosas de esa manera ... espero que esto ayude
La expresión de clase se puede utilizar por simplicidad.
// Foo.js
''use strict'';
// export default class Foo {}
module.exports = class Foo {}
-
// main.js
''use strict'';
const Foo = require(''./Foo.js'');
let Bar = new class extends Foo {
constructor() {
super();
this.name = ''bar'';
}
}
console.log(Bar.name);
// person.js
''use strict'';
module.exports = class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
display() {
console.log(this.firstName + " " + this.lastName);
}
}
// index.js
''use strict'';
var Person = require(''./person.js'');
var someone = new Person("First name", "Last name");
someone.display();