2016-06-15 77 views
5

檢查nodejs中繼承的最佳方法是什麼?在nodejs中檢查繼承

我想在另一個模塊類的實例中使用instanceof,這個模塊繼承了這個模塊的類。

文件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

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

class C extends A{ 

} 

global.c = new C(); 
+0

'global.c'是在你使用它的地方定義的嗎?看着你的代碼,看起來並不是這樣。如果將'global.c instanceof A'移動到'c.js'的末尾,會發生什麼? – nils

+0

我有一個在每個請求中運行的對象的列表,我無法控制創建對象的位置,當我在外部文件中運行類型爲crate的實例時,它會爲我返回false。 –

+1

然後你需要一個不同的方法。如果您無法控制加載順序,那麼依靠加載順序將會失敗。 –

回答

2

這是因爲加載問題的!加載類C時,它會請求類A,並在C被定義之前運行。

我已經自己嘗試過,如果我按照你提到的要求做了這兩個類,那麼第二個比較失敗。

然而,這一個工作的:

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

主要方法

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

具有輸出

true 
true 

爲了更好地瞭解怎麼回事,我創造了這個例子

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

有了這個輸出

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 

如果你改變它要求 「」 第一,那麼C是不是在所有

server.js變裝:

require('services/a'); 

擁有此輸出

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

移動的基類到另一個文件和作品,感謝 –