2016-11-03 57 views
2
class Thing { 
    constructor(parameter) { 
    if (parameter) { 
     this.x = parameter; 
    } 
    return this; 
    } 

    getX() { 
    return this.x; 
    } 

    static specialThing() { 
    return new Thing('Special Thing'); 
    } 
} 

let thingy = Thing.specialThing(); 
thingy.getX(); // 'Special Thing' 

我想在JavaScript中完成上述操作(儘管以更復雜的形式)。當我運行這個代碼時,它運行良好,但我感到奇怪的是,在類中的某個函數返回該類的實例化版本。有沒有什麼理由不以這種方式構建我的代碼?有了ES6類,可以從靜態方法返回該類的實例嗎?

甲起作用的替代靜態方法是:

Thing.specialThing =() => { 
    return new Thing('Special Thing'); 
}; 

什麼是一些長處和短處(如果有的話),使用的這些東西任一個?有沒有其他更好的方法可以實現我不知道的目標?

+1

有什麼都沒有錯。 – Pointy

+0

這個結構在其他語言中是非常常見的,你可能還沒有在js中看到它的唯一原因是因爲類是JavaScript的新手。 –

+1

很酷的感謝回覆@Pointy&@Pamblam! 另外一般問題 - 爲什麼評論答案而不是回答? – thisissami

回答

3

對於ES6類,可以從靜態方法返回該類 的實例嗎?

當然,這很好,在某些情況下這是可以接受的做法。當你想編寫一個可重複使用的函數時,通常會使用它,可以從幾個地方調用一個調用構造函數和創建對象的特定方法。

您的名爲specialThing的靜態函數被稱爲工廠函數(一種爲您創建並返回對象的常規函數​​)。工廠函數可以是你展示的靜態方法,也可以是其他類型對象的方法,也可以是普通函數(基本上任何類型的函數,靜態或非靜態)。

所以,假設你的代碼中有四個地方都創建了與構造函數相同或基本相同的參數的相同類型的對象。與其將代碼複製到四個地方,您只需創建一個共享函數,爲您完成所有常見工作,然後可以在多個地方使用它,就像將任何其他常用代碼放入共享函數一樣。除了在創建和返回對象時,該類型的共享函數具有特定的名稱(工廠函數)。正如我前面所說的,工廠函數可以是任何類型的函數(無論哪種函數最適合您的編碼設計),所以靜態方法當然是編碼它的可接受方式之一。

1

有了ES6類,可以從靜態方法返回該類的實例嗎?

是的,在函數式編程非常常見的太

class Box { 
 
    constructor (value) { 
 
    this.value = value 
 
    } 
 
    fmap (f) { 
 
    return Box.of (f (this.value)) 
 
    } 
 
    concat ({value}) { 
 
    return Box.of (this.value + value) 
 
    } 
 
    static of (value) { 
 
    return new Box (value) 
 
    } 
 
} 
 

 
const sq = x => x * x 
 

 
let b = Box.of(3).fmap(sq).concat(Box.of(4).fmap(sq)) 
 

 
console.log (b) 
 
// { Box 3*3 + 4*4 } 
 
// { Box 25 }

相關問題