質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

2207閲覧

JavaScriptのstaticメソッドの使い方

nekojiro

総合スコア43

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2017/12/07 13:16

編集2017/12/07 13:16

一度同じような質問をしました。そのときにJavaのstaticメソッドを参考にしていたのですが、他の言語は参考しないほうがいいと回答があったのでもう一度質問します。

JavaScriptのstaticメソッドを使うメリット、デメリットは何ですか。
どのようなときに使うべきですか。
また下記使い方はjavascriptのオブジェクト指向的に使うべきなんでしょうか。
staticにすると可読性が上がっていいと思います。
exampleconsole.logで確認すると__proto__constructorの中にbメソッドがあるのでインスタンスにコピーされてないと思うのでメモリも多く使っているわけでもないから使ったほうがいいよう気がします。

javascript

1class Example { 2 constructor(number) { 3 this.number = number; 4 } 5 6 a() { 7 return Example.b(this.number); 8 } 9 10 static b(number) {// thisを使ってないことが一目でわかる 11 return number * 2; 12 } 13} 14 15const example = new Example(2); 16console.log(example);// オブジェクトの中にbメソッドはない 17console.log(example.a());

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2017/12/08 02:14

メソッド a も、実体はインスタンスではなく、Example.prototype にあるのでやはりコピーされていないような?
nekojiro

2017/12/08 02:22

仰る通りです。メッソドaもprototypeになってます。
guest

回答2

0

staticにする意味は**「◯◯という分野に属する△△という機能」**を表現するのによく使われます。JavaScript標準にMathクラスがありますが、Mathクラスをnewして使うことはないですよね?でもMath.abs()とかで使われますね。これは「数学的機能をまとめたMathクラス」にstaticでメソッドをもたせることにより、見た人に「あ、これは数学の絶対値(Absolute)を求める関数か」とひと目で分かるようになります。いきなりabs()と書かれるより、頭に「数学」を表すMathが付いているほうが可読性が上がりますね。

また、グローバル関数として定義するのではなく、クラスのstaticメソッドとして持たせることにより「関数名が同名であっても干渉されない」メリットがあります。例えばグローバルにfunction hoge()と定義してしまうと、後から追加したコードでhogeという名前のグローバル関数を作れなくなりますが、Hogeクラスのhogeというstaticメソッドとして定義すれば、別の人はFugaクラスのhogeといった具合に「別のクラスで同じ名前のメソッドを定義しても大丈夫」になります。これは例えば「copy」や「clone」や「add」といった、「誰でも付けそうな名前のメソッド」で特に効果を発揮します。

投稿2017/12/08 01:52

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

クラス変数のないjavascriptで静的メソッドやクラスメソッドを使うメリットはほとんどなさそうな気がします。

一方でデメリットもあまりないと思いますが、質問のコードのようにメソッド内でクラス名を直書きするのは、継承でバグを生みやすくなりそうな気がします。

javascript

1class Example { 2 constructor(number) { 3 this.number = number; 4 } 5 6 a() { 7 return Example.b(this.number); 8 } 9 10 static b(number) { 11 return number * 2; 12 } 13} 14class Example2 extends Example { 15 static b(number) { 16 return number * 3; 17 } 18} 19 20const example = new Example2(2); 21example.a(); //4 22

this.constructorからたどったほうがいいのではないかな、と。
クラスへの参照があれば楽でいいんですけどねえ。

コメントを受けて追記

いえいえ、こんな書き方をすれば継承でも使えると思いますよ。

javascript

1class Example { 2 constructor(number) { 3 this.number = number; 4 } 5 6 get cls_(){ 7 return this.constructor; 8 } 9 10 a() { 11 return this.cls_.b(this.number); 12 } 13 14 static b(number) { 15 return number * 2; 16 } 17} 18 19class Example2 extends Example { 20 static b(number) { 21 return number * 3; 22 } 23} 24 25const example = new Example2(2); 26return example.a()//6;

投稿2017/12/08 03:09

編集2017/12/08 03:51
Lhankor_Mhy

総合スコア35865

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekojiro

2017/12/08 03:32

継承のことは全く考えていませんでした。継承するなら使わないほうがよさそうですね。
Lhankor_Mhy

2017/12/08 03:52

コメントを受けて追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問