2015-09-18 13 views
49

definiere ich eine Klasse in einem Modul:Wie exportiert man eine ES6-Klasse richtig in Knoten 4?

"use strict"; 

var AspectTypeModule = function() {}; 
module.exports = AspectTypeModule; 

var AspectType = class AspectType { 
    // ...  
}; 

module.export.AspectType = AspectType; 

Aber ich bekomme die folgende Fehlermeldung:

TypeError: Cannot set property 'AspectType' of undefined 
    at Object.<anonymous> (...\AspectType.js:30:26) 
    at Module._compile (module.js:434:26) 
    .... 

Wie soll ich diese Klasse exportieren und in einem anderen Modul verwenden? Ich habe andere SO-Fragen gesehen, aber ich bekomme andere Fehlermeldungen, wenn ich versuche, ihre Lösungen zu implementieren.

+0

in ES6 brauchen Sie nicht ' 'Verwendung strict'' in einem Modul oder Klasse; es ist das Standardverhalten. Ref. 10.2.1 Strict Mode Code –

Antwort

61

Wenn Sie ES6 verwenden in Knoten 4 können Sie nicht ES6 Modul Syntax ohne Transpiler , aber CommonJS-Module (Node-Standardmodule) funktionieren gleich.

module.export.AspectType 

sollte

module.exports.AspectType 

daher die Fehlermeldung "Can not set Eigenschaft 'AspectType' undefinierter", weil module.export === undefined sein.

Auch für

var AspectType = class AspectType { 
    // ...  
}; 

können Sie schreiben gerade

class AspectType { 
    // ...  
} 

und im Wesentlichen das gleiche Verhalten bekommen.

+11

OMG "Export" statt "Export", wie habe ich das vermisst? – JVerstry

+1

am Ende habe ich 'module.exports = ClassName' und es funktioniert gut –

+0

danke. das funktioniert super. –

7

Verwenden

// aspect-type.js 
class AspectType { 

} 

export default AspectType; 

Dann importieren es

// some-other-file.js 
import AspectType from './aspect-type'; 

lesen http://babeljs.io/docs/learn-es2015/#modules für mehr Details

+1

Ich erhalte einen 'SyntaxError: Unexpected reserved word', können Sie ein vollständiges Codebeispiel angeben? – JVerstry

+0

Das ist genau das, was ich tat, aber ich bekomme immer noch die Fehlermeldung oben .. – JVerstry

+0

Ich habe ein Problem geöffnet: https://github.com/nodejs/node/issues/2954 – JVerstry

9

class expression kann zur Vereinfachung verwendet werden.

// 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); 
+2

Nur eine Warnung, in Node unterliegt dies der Ladereihenfolge des Moduls. Also sei vorsichtig damit. Wenn Sie die Namen dieser Dateien umschalten, würde das Beispiel nicht funktionieren. – Dustin

53
// 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(); 
+3

Funktioniert nicht ... –

+0

@Sitrakay sollten Sie wirklich eine Erklärung hinzufügen, wie dies die Frage behebt. –

0

hatte ich das gleiche Problem. Was ich fand war, dass ich mein empfangendes Objekt den gleichen Namen wie der Klassenname nannte. Beispiel:

const AspectType = new AspectType(); 

diese Dinge geschraubt, dass die Art und Weise nach oben ... hoffe, das hilft

9

Einige der anderen Antworten kommen nah, aber ehrlich gesagt, ich glaube, du bist besser dran mit der saubersten, einfachsten gehen Syntax. Das OP beantragte eine Möglichkeit, eine Klasse in ES6/ES2015 zu exportieren.Ich glaube nicht, dass Sie viel sauberer als dieses nicht erhalten:

'use strict'; 

export default class ClassName { 
    constructor() { 
    } 
} 
+0

funktionierte nicht für mich –

0

Manchmal brauche ich mehrere Klassen in einer Datei, oder ich will den Export Basisklassen zu erklären und ihre Namen behalten exportiert wegen meiner JetBrains Editor versteht, dass besser. Ich benutze nur

global.MyClass = class MyClass { ... }; 

Und woanders:

require('baseclasses.js'); 
class MySubclass extends MyClass() { ... } 
+1

Dies ist eine schlechte Möglichkeit, dies zu tun ... es ** wird ** in einer Kollision eines Tages führen. – Brad

+0

Bereue deine Sünden, um deine Coderseele zu retten! –

+0

Ja gut. Kein Problem mit Kollisionen in eigenen Projekten. Und wenn Sie Klassen nur über require/module.exports importieren, verschieben Sie einfach das Problem auf die Modulnamen. –

1

ich es auf diese Weise einfach schreiben

in der AspectType Datei:

class AspectType { 
    //blah blah 
} 
module.exports = AspectType; 

und importieren Sie es wie folgt aus:

const AspectType = require('./AspectType'); 
var aspectType = new AspectType; 
0

Mit ECMAScript 2015 können Sie mehrere Klassen wie diese

class Person 
{ 
    constructor() 
    { 
     this.type = "Person"; 
    } 
} 

class Animal{ 
    constructor() 
    { 
     this.type = "Animal"; 
    } 
} 

module.exports = { 
    Person, 
    Animal 
}; 

dann exportieren und importieren, wo Sie sie verwenden:

const { Animal, Person } = require("classes"); 

const animal = new Animal(); 
const person = new Person(); 

Bei Namenskollisionen oder Sie andere Namen bevorzugen Sie sie umbenennen dies wie:

const { Animal : OtherAnimal, Person : OtherPerson} = require("./classes"); 

const animal = new OtherAnimal(); 
const person = new OtherPerson(); 
Verwandte Themen