2016-06-15 9 views
5

Was ist der beste Weg, die Vererbung in nodejs zu überprüfen? Ich versuche instanceof in einer Instanz einer Klasse eines anderen Moduls zu verwenden, das eine Klasse für dieses Modul erbtÜberprüfen der Vererbung in nodejs

Datei 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; 

Datei c.js

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

class C extends A{ 

} 

global.c = new C(); 
+0

Ist 'global.c' definiert, wo Sie es verwenden? Wenn Sie Ihren Code betrachten, scheint es nicht so. Was passiert, wenn Sie Ihre 'global.c -Instanz von A' an das Ende von' c.js' verschieben? – nils

+0

Ich habe eine Liste von Objekten, die in jeder Anfrage laufen, und ich kann nicht kontrollieren, wo das Objekt erstellt wird, wenn ich die Instanz von für einen Typ in einer externen Datei crateed ausführen, es gibt für mich false zurück. –

+1

Sie brauchen dann einen anderen Ansatz.Wenn Sie die Ladereihenfolge nicht steuern können, schlägt die Ladefolge fehl. –

Antwort

2

es wegen der Lade Problem ist! Wenn Sie Klasse C laden, fordern Sie Klasse A an, und es wird ausgeführt, bevor das C definiert ist.

Ich habe es selbst versucht, wenn ich es getan habe, wie Sie erwähnt und beide Klassen angefordert haben, der zweite Vergleich ist gescheitert.

jedoch diese funktioniert:

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(); 

Die wichtigste Methode

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

Ausgang

true 
true 

Um besser zu verstehen, was los ist, habe ich habe dieses Beispiel

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

Mit diesem Ausgang

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 

Wenn Sie es ändern "a" zuerst erfordern, wird die C überhaupt nicht

server.js Änderung geladen:

require('services/a'); 

Mit diesem Ausgang

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

Ich habe die Basisklasse in eine andere Datei verschoben und funktioniert, danke –