2016-06-15 11 views
5

Jaki jest najlepszy sposób sprawdzania dziedziczenia w nodejs?Sprawdź dziedziczenie w nodejs

Próbuję użyć instanceof w instancji klasy innego modułu, który dziedziczy klasę dla tego modułu.

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

plików c.js

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

class C extends A{ 

} 

global.c = new C(); 
+0

Czy zdefiniowano "global.c" w miejscu, w którym go używasz? Patrząc na twój kod, nie wydaje się tak. Co stanie się, jeśli przeniesiesz instancję 'global.c instanceof na końcu' c.js'? – nils

+0

Mam listę obiektów, które działają w każdym żądaniu i nie mogę kontrolować, gdzie obiekt jest tworzony, gdy uruchomię instancję dla typu skrzyni w pliku zewnętrznym, który zwraca dla mnie false. –

+1

Będziesz wtedy potrzebować innego podejścia.Jeśli nie możesz kontrolować kolejności ładowania, to poleganie na kolejności ładowania nie powiedzie się. –

Odpowiedz

2

To dlatego załadunku problemu! Podczas ładowania klasy C żąda ona klasy A i jest uruchamiana przed zdefiniowaniem C.

Próbowałem sam, jeśli zrobiłem to, o czym wspomniałeś i poprosiłeś obie klasy, drugie porównanie nie powiodło się.

Jednak ten działa:

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

Główną metodą

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

posiadające wyjście

true 
true 

Aby lepiej zrozumieć, co się dzieje, ja stworzyliśmy tym przykładzie

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

Mając to wyjście

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 

Jeśli zmienisz go wymagać "a", potem C nie jest ładowany w ogóle

server.js zmian:

require('services/a'); 

Po tym wyjściu

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

przeniosłem baseclass do innego pliku i działa, dziękuję –