0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScript で static メソッドと同名のインスタンスメソッドを定義する

Posted at

TL;DR

JSでクラスを書く際、処理が共通しているので全部のインスタンスに持たせる必要のないメソッドを静的メソッドとして書きたいときがあります。
同じ処理をインスタンスからも実行したい、というとき、同じ名前でインスタンスメソッドを宣言することができます。

コード例

クラス宣言

textSeparator.js
class TextSeparator {
  static DELIMITER = /(?<=[.!?。!?])\r?\n?/;

  constructor(text='') {
    this.text = text;
  }

  // static メソッド
  static split(text) {
    return text.split(TextSeparator.DELIMITER);
  }

  // インスタンスメソッドを同名で宣言し、処理にインスタンスプロパティを使用する
  split() {
    return TextSeparator.split(this.text);
  }
}

正規表現は適当です。真似しないでください。


static メソッドを関数的に呼び出す

script.js
// textSeparator.js を読み込んでおいてください

const text = ` 桜の樹の下には屍体が埋まつてゐる!\n これは信じていいことなんだよ。何故つて、桜の花があんなにも見事に咲くなんて信じられないことぢやないか。俺はあの美しさが信じられないので、この二三日不安だつた。しかしいま、やつとわかるときが来た。桜の樹の下には屍体が埋まつてゐる。これは信じていいことだ。`;

const result = SentenceSeparator.split(text);

result.forEach( s => console.log(s) );

実行結果

 桜の樹の下には屍体が埋まつてゐる!
 これは信じていいことなんだよ。
何故つて、桜の花があんなにも見事に咲くなんて信じられないことぢやないか。
俺はあの美しさが信じられないので、この二三日不安だつた。
しかしいま、やつとわかるときが来た。
桜の樹の下には屍体が埋まつてゐる。
これは信じていいことだ。

対象をプロパティとして保存しながら、インスタンスメソッドとして呼び出す

script.js
// textSeparator.js を読み込んでおいてください

const text = ` 桜の樹の下には屍体が埋まつてゐる!\n これは信じていいことなんだよ。何故つて、桜の花があんなにも見事に咲くなんて信じられないことぢやないか。俺はあの美しさが信じられないので、この二三日不安だつた。しかしいま、やつとわかるときが来た。桜の樹の下には屍体が埋まつてゐる。これは信じていいことだ。`;

const ss = new SentenceSeparator(text);
const result = ss.split();

result.forEach( s => console.log(s) );

実行結果

 桜の樹の下には屍体が埋まつてゐる!
 これは信じていいことなんだよ。
何故つて、桜の花があんなにも見事に咲くなんて信じられないことぢやないか。
俺はあの美しさが信じられないので、この二三日不安だつた。
しかしいま、やつとわかるときが来た。
桜の樹の下には屍体が埋まつてゐる。
これは信じていいことだ。

おわりに

果たしてこのような書き方が推奨されるかどうかわかりませんが、動作はするという記録です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?