J'ai défini une classe dans un module:
"use strict";
var AspectTypeModule = function() {};
module.exports = AspectTypeModule;
var AspectType = class AspectType {
// ...
};
module.export.AspectType = AspectType;
Mais je reçois le message d'erreur suivant:
TypeError: Cannot set property 'AspectType' of undefined
at Object.<anonymous> (...\AspectType.js:30:26)
at Module._compile (module.js:434:26)
....
Comment dois-je exporter cette classe et l'utiliser dans un autre module? J'ai vu d'autres SO questions, mais j'obtiens d'autres messages d'erreur lorsque j'essaie de mettre en œuvre leurs solutions.
Si vous utilisez ES6 dans Node 4, vous ne pouvez pas utiliser la syntaxe de module ES6 sans transpiler, mais les modules CommonJS (modules standard de Node) fonctionnent de la même manière.
module.export.AspectType
devrait être
module.exports.AspectType
d'où le message d'erreur "Impossible de définir la propriété 'AspectType' de non définie" car module.export === undefined
.
Aussi pour
var AspectType = class AspectType {
// ...
};
pouvez-vous simplement écrire
class AspectType {
// ...
}
et obtenez essentiellement le même comportement.
// 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();
Avec ECMAScript 2015, vous pouvez exporter et importer plusieurs classes comme celle-ci.
class Person
{
constructor()
{
this.type = "Person";
}
}
class Animal{
constructor()
{
this.type = "Animal";
}
}
module.exports = {
Person,
Animal
};
alors où vous les utilisez:
const { Animal, Person } = require("classes");
const animal = new Animal();
const person = new Person();
En cas de collision de noms, ou si vous préférez d’autres noms, vous pouvez les renommer comme suit:
const { Animal : OtherAnimal, Person : OtherPerson} = require("./classes");
const animal = new OtherAnimal();
const person = new OtherPerson();
Utilisation
// aspect-type.js
class AspectType {
}
export default AspectType;
Puis l'importer
// some-other-file.js
import AspectType from './aspect-type';
Lire http://babeljs.io/docs/learn-es2015/#modules pour plus de détails
expression de classe peut être utilisé pour des raisons de simplicité.
// 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);
Plusieurs autres réponses se rapprochent, mais honnêtement, je pense que vous feriez mieux d'utiliser la syntaxe la plus simple et la plus nette. Le PO a demandé un moyen d’exporter une classe dans ES6/ES2015. Je ne pense pas que vous puissiez être beaucoup plus propre que cela:
'use strict';
export default class ClassName {
constructor () {
}
}
Je l'écris simplement de cette façon
dans le fichier AspectType:
class AspectType {
//blah blah
}
module.exports = AspectType;
et l'importez comme ceci:
const AspectType = require('./AspectType');
var aspectType = new AspectType;
J'ai eu le même problème. Ce que j’ai trouvé c’est que j’ai appelé mon objet receveur le même nom que le nom de la classe. exemple:
const AspectType = new AspectType();
ce foutu les choses de cette façon ... espérons que cela aide