2016-03-30 3 views
15

Was ist der richtige Weg, um eine in einer Datei definierte Klasse zu verwenden und sie in node.js um eine weitere zu erweitern?ES6-Klassen, mit Eltern in einer anderen Datei und node.js?

Zur Zeit habe ich:

'use strict' 

class BasePageHandler { 

    constructor(app, settings, context) { 

    } 
} 

return module.exports; 

In der 'Kind' Klassendatei Ich habe:

'use strict' 

var BasePageHandler = require ('./../BasePageHandler.js'); 

class FrontpagePageHandler extends BasePageHandler { 
    constructor(app, settings, context) { 
     super(app, settings, context); 
     this.settings = settings; 
     this.context = context; 
    } 
} 

Dies schlägt mit dem folgenden Fehler:

TypeError: Class extends value #<Object> is not a function or null 

Hinweis, wenn ich Habe den BasePageHandler in der gleichen Datei dann funktioniert es, also ist es wirklich wenn die Klasse in einer anderen Datei ist habe ich ein Problem.

Momentan wird der Knoten 4.4.0 verwendet.

+0

Sie können [ES6 nativen Module] (http://exploringjs.com/es6/ch_modules.html) mit dem [Common JS verwandeln Plugin für Babel verwenden möchten ] (https://www.npmjs.com/package/babel-plugin-transformes-es2015-modules-commonjs), stattdessen 'module.exports'. Auf diese Weise bleibt Ihr Code für die Zukunft bereit, wenn Node Module nativ implementiert. –

Antwort

25

Sie müssen die korrekte Schreibweise Ihrer Klasse in BasePageHandler.js-Datei exportieren:

module.exports = BasePageHandler; 
+0

In der Tat. Ich habe das Offensichtliche verpasst :) –

+2

Ich bin mir ziemlich sicher, dass du es auch einfach in eine Zeile schreiben kannst: 'module.exports = class BasePageHandler {' so, wenn du die Klasse umbenennst, ist es 1 weniger Platz, um sie später zu ändern. – CodingWithSpike

+1

Event nachdem ich das getan habe, habe ich immer noch das gleiche Problem? Ich benutze die 'harmony_destructuring'-Flagge! – James111

7

Die akzeptierte Antwort ist technisch gut, aber wirklich, wenn Sie ES6 verwenden, dann sollten Sie alle in und verwenden ES6 export/import gehen.

/*jshint esversion: 6 */ 

class BasePageHandler { 
    constructor(app, settings, context) { 
    } 
} 

export default BasePageHandler; 

und dann:

/*jshint esversion: 6 */ 

import BasePageHandler from './../BasePageHandler.js'; 

class FrontpagePageHandler extends BasePageHandler { 
    constructor(app, settings, context) { 
     super(app, settings, context); 
     this.settings = settings; 
     this.context = context; 
    } 
} 
+4

BTW, es gibt keine Notwendigkeit "verwenden Sie streng" in ES6 - es wird standardmäßig erzwungen. –

Verwandte Themen