2016-03-30 19 views
15

Qual è il modo corretto di utilizzare una classe definita in un file e di estenderne un'altra, in node.js?Classi ES6, con genitore in file diversi e node.js?

Attualmente ho:

'use strict' 

class BasePageHandler { 

    constructor(app, settings, context) { 

    } 
} 

return module.exports; 

Nel file di classe 'bambino' che ho:

'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; 
    } 
} 

Questo non riesce con il seguente errore:

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

nota, se io avere il BasePageHandler nello stesso file allora funziona, quindi è davvero quando la classe è in un altro file ho un problema.

Attualmente utilizzando il nodo 4.4.0.

+0

si consiglia di utilizzare [ES6 moduli nativi] (http://exploringjs.com/es6/ch_modules.html) con il plugin [Comune JS trasformare per Babel ] (https://www.npmjs.com/package/babel-plugin-transform-es2015-modules-commonjs), invece 'module.exports'. In questo modo, il tuo codice rimarrà pronto per il futuro quando Node implementa i moduli in modo nativo. –

risposta

25

avete bisogno di esportare correttamente la classe in BasePageHandler.js di file:

module.exports = BasePageHandler; 
+0

Infatti. Mi è sfuggito l'ovvio :) –

+2

Sono abbastanza sicuro che puoi anche metterlo su 1 riga: 'module.exports = class BasePageHandler {' In questo modo se si rinomina la classe, è 1 posto in meno per cambiarlo in seguito. – CodingWithSpike

+1

Evento dopo aver fatto questo, sto ancora avendo lo stesso problema? Sto usando la bandiera 'harmony_destructuring'! – James111

7

La risposta accettata è tecnicamente bene, ma in realtà se si sta utilizzando ES6 allora si dovrebbe andare all in e utilizzare ES6 export/import.

/*jshint esversion: 6 */ 

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

export default BasePageHandler; 

e poi:

/*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, non è necessario 'usare strict' in ES6 - è forzato per impostazione predefinita. –

Problemi correlati