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
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
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. –
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ę. –