2016-06-15 15 views
5

Qual è il modo migliore per controllare l'ereditarietà in nodejs?Controllare l'ereditarietà nel nodo

Sto cercando di utilizzare instanceof in un'istanza di una classe di un altro modulo che eredita una classe per questo modulo.

file di a.js

class A{ 

    } 

    class B extends A{ 

    } 

    var b = new B(); 

    b instanceof A ///this work 
    global.c instanceof A //this doesn't work 

    module.exports = A; 

c.js di file

var A = require("./a"); 

class C extends A{ 

} 

global.c = new C(); 
+0

È 'global.c' definito dove lo si utilizza? Guardando il tuo codice, non sembrerebbe così. Cosa succede se sposti la tua 'global.c instanceof A' alla fine di' c.js'? – nils

+0

Ho un elenco di oggetti che vengono eseguiti in ogni richiesta e non riesco a controllare dove viene creato l'oggetto quando eseguo l'istanza di per un tipo creato in un file esterno restituisce false per me. –

+1

Avrai bisogno di un approccio diverso allora.Se non riesci a controllare l'ordine di caricamento, fare affidamento sull'ordine di caricamento fallirà. –

risposta

2

E 'a causa del rilascio di carico! Quando si carica la classe C, richiede la classe A e viene eseguita prima che sia definita la C.

L'ho provato da solo, se l'avessi fatto come hai detto e richiesto entrambe le classi, il secondo non è riuscito a comparare.

Tuttavia questo funziona:

a.js

class A{ 
    callMeLaterAligator(){ 
     console.log(b instanceof A) ///this work 
     console.log(global.c instanceof A) //this now work 
    } 
} 

class B extends A{ 

} 

var b = new B(); 

module.exports = A; 

c.js

var A = require("./a"); 

class C extends A{ 

} 

global.c = new C(); 

Il metodo principale

require('services/c'); 
const a = require('services/a'); 
const aInst = new a(); 
aInst.callMeLaterAligator(); 

avente uscita

true 
true 

Per capire meglio cosa sta succedendo, ho creato questo esempio

a.js

console.log('Hello, I am class A and I am not yet defined'); 
class A{ 

} 

class B extends A{ 

} 

var b = new B(); 

console.log('Hello, I am class A and I will compare something'); 
console.log(b instanceof A) ///this work 
console.log(global.c instanceof A) //this doesn't work 

module.exports = A; 

c.js

console.log('Hello, I am class C and I am not yet defined'); 

var A = require("./a"); 

console.log('Hello, I am class C and I will now try to defined myself'); 

class C extends A{ 

} 

console.log('Hello, I am class C and I am defined'); 
global.c = new C(); 

console.log('Hello, I am class C and I am in global.c'); 

server.js

require('services/c'); 

Avere questa uscita

Hello, I am class C and I am not yet defined 
Hello, I am class A and I am not yet defined 
Hello, I am class A and I will compare something 
true 
false 
Hello, I am class C and I will now try to defined myself 
Hello, I am class C and I am defined 
Hello, I am class C and I am in global.c 

Se si modifica a richiedere "una" prima, poi la C non è caricato a tutti

server.js cambiamento:

require('services/a'); 

Avendo questa uscita

Hello, I am class A and I am not yet defined 
Hello, I am class A and I will compare something 
true 
false 
+0

ho spostato la baseclass in un altro file e funziona, grazie –