簡體   English   中英

使用ES6類,可以從靜態方法返回該類的實例化嗎?

[英]With ES6 Classes, is it ok to return an instantiation of that class from a static method?

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進行上述操作(盡管形式更復雜)。 目前,當我運行此代碼時,它運行良好,但是對於類中的函數返回該類的實例化版本,我感到很奇怪。 有什么理由不這樣構建我的代碼嗎?

靜態方法的有效替代方法是:

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

使用其中任何一種有什么優點和缺點(如果有)? 還有其他我不知道的更好的方法可以實現此目標嗎?

使用ES6類,可以從靜態方法返回該類的實例化嗎?

當然可以,這在某些情況下是可接受的做法。 當您希望將其編碼為可重用的函數時,通常可以使用該函數,該函數可以從多個位置調用以一種特定的方式調用構造函數並創建對象。

名為specialThing靜態函數稱為工廠函數(一種為您創建並返回對象的常規函數​​)。 工廠函數可以是如您所示的靜態方法,也可以是某種其他類型的對象的方法,也可以只是常規函數(基本上是任何類型的函數,無論是否為靜態)。

因此,假設您的代碼中有四個地方都創建了具有相同或幾乎相同構造函數參數的相同類型的對象。 無需將代碼復制到四個位置,您只需創建一個共享功能即可為您完成所有常見工作,然后可以在多個位置使用該功能,就像將其他任何通用代碼放入共享功能中一樣。 除創建和返回對象外,該類型的共享函數均具有特定名稱(工廠函數)。 如前所述,工廠函數可以是任何類型的函數(無論哪種形式最適合您的編碼設計),因此靜態方法無疑是對其進行編碼的可接受方法之一。

使用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 } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM