![](/img/trans.png)
[英]Referencing static members from instance method on dynamically extended JS class
[英]Referencing static method in Class exported from Node JS module
問題是如何從NodeJS模塊導出的類的靜態方法中引用其他靜態方法? 這是一個設置。 我有以下模塊: test1.js
var Parent = class {
static smethod1 () {
return this.smethod2();
}
static smethod2 () {
return "Testing tube";
}
}
module.exports = {
Parent:Parent
}
然后我有require
這個模塊的test2.js
var mod = require('./test1');
var Parent = mod.Parent;
module.exports = {
sm1: Parent.smethod1,
sm2: Parent.smethod2
}
最后,我有一個正在run.js
中運行的run.js
var test2 = require('./test2');
console.log(test2.sm1());
自然,我想看到打印出的"Testing tube"
行。 我遇到錯誤
return this.smethod2();
^
TypeError: this.smethod2 is not a function
當然,在NodeJS上有一個惡作劇, this
指的是模塊,但不是應該指代函數嗎? 有沒有辦法使用當前設置從smethod1
引用靜態方法smethod2
? 如果沒有,有什么解決方法?
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
作為參數傳遞給call
或apply
,這僅針對一次調用手動設置this
參數:
var Parent = require('./test1');
var test2 = require('./test2');
// call `test2.sm1` with a context of `Parent`
console.log(test2.sm1().call(Parent));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.