2017-02-28 80 views
0

問題是如何從NodeJS模塊導出的類的靜態方法中引用其他靜態方法?這是一個設置。我有以下模塊:test1.js在從NodeJS模塊導出的類中引用靜態方法

var Parent = class { 
    static smethod1() { 
     return this.smethod2(); 
    } 

    static smethod2() { 
     return "Testing tube"; 
    } 
} 

module.exports = { 
    Parent:Parent 
} 

然後,我有test2.jsrequire s此模塊

var mod = require('./test1'); 
var Parent = mod.Parent; 

module.exports = { 
    sm1: Parent.smethod1, 
    sm2: Parent.smethod2 
} 

最後,我有一個是在正在運行run.js

var test2 = require('./test2'); 

console.log(test2.sm1()); 

自然碼,我想看看"Testing tube"行打印出來。我對收到的NodeJS錯誤

 return this.smethod2(); 
        ^

TypeError: this.smethod2 is not a function 

當然,還有的惡作劇,其中this指模塊,但應該不會是指一個功能呢?有沒有辦法參考目前的設置從smethod1靜態方法smethod2?如果沒有,解決方法是什麼?

+0

你可以對這個答案一看:http://stackoverflow.com/a/28979516/1681972 – Ravi

+0

如果你有一個只有靜態方法的類,這是你應該只導出功能的標誌直接和d參加課程,供參考。 – loganfsmyth

+0

@loganfsmyth這當然是簡化。 – EvgeniySharapov

回答

2

this關鍵字在JavaScript中很怪異,並不總是像大多數基於類的語言一樣引用您的實例。在你的情況,當你調用test2.sm1()this被設置爲test2對象,這是

{ 
    sm1: Parent.smethod1, 
    sm2: Parent.smethod2 
} 

該對象不具有smethod2功能。

this基於JavaScript中調用函數的方式進行設置,具體取決於'.'之前的任何內容:->test2<-.sm1()

有幾種解決方法。首先,限定Parent類後,可以爲功能結合this到類:

var Parent = class { 
    static smethod1() { 
     return this.smethod2(); 
    } 

    static smethod2() { 
     return "Testing tube"; 
    } 
} 

// bind `this` to `Parent` 
Parent.smethod1 = Parent.smethod1.bind(Parent); 

module.exports = { 
    Parent:Parent 
} 

或者,可以通過Parent作爲參數傳遞給callapply,其中手動設置this爲只是一個調用:

var Parent = require('./test1'); 
var test2 = require('./test2'); 

// call `test2.sm1` with a context of `Parent`  
console.log(test2.sm1().call(Parent)); 
+0

看一看MDN的例子https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static – EvgeniySharapov

+0

@EvgeniySharapov有趣的是,我想它在JavaScript中是有意義的,你可以用'this'調用其他靜態方法。我改變了我的答案。 – jct

+0

看起來像使用'bind'工作正常。我在'test2.js'中有'module.exports = {sm1:Parent.smethod1.bind(Parent),sm2:Parent.smethod2.bind(Parent)}' – EvgeniySharapov

相關問題