LoginSignup
NTR893
@NTR893 (NoTry89 Ris3)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Constructorの使い道について

classで、constructorを習ったのですが、どういう使い方をするのかが知りたいです。

わたしが1つ思ったのは、以下のように変数を定義しておくことで、その変数を別々の関数で使うときに、何度も定義しなくてもよくなることくらいだったのですが、他には、 一般的にどのような時に使用するのかが知りたいです。

    constructor(){
      this.username = document.querySelectorAll('#sunbreak_username');
      this.usernumber = this.username.length;
    }

    noname(){
        for(let count = 0; this.usernumber !== count; count++){
           if(this.username[count].innerHTML === ''){
               this.username[count].innerHTML = '名無しのユーザー'; 
           }
         }
    }
   }
0

2Answer

貴方のコードを見る限り、そもそもclassの意義をきちんと理解できていないように見えます。

前提として、貴方のコードはclassを使わずとも、以下に示すように書くのと同じですよね。

const username = document.querySelectorAll('#sunbreak_username');
const usernumber = username.length;
function noname(){
  for(let count = 0; this.usernumber !== count; count++){
    if(this.username[count].innerHTML === ''){
      this.username[count].innerHTML = '名無しのユーザー'; 
    }
  }
}

わざわざclassを使う必要が無いです。
「いや、グローバル変数にするのはちょっと……」と思うかもしれませんが、それが困るならばこんな書き方も出来ます。

const UserManager={
  username:document.querySelectorAll('#sunbreak_username'),
  usernumber:this.username.length,
  noname:function(){
    for(let count = 0; this.usernumber !== count; count++){
      if(this.username[count].innerHTML === ''){
        this.username[count].innerHTML = '名無しのユーザー'; 
      }
    }
  }
}

じゃあ、classとはいつ使うのか、どう使うのか。それは「複数のデータのまとまりを保存したいとき」です。例えば

  1. username(デフォルトで名無しのユーザー、もしかしたら名前を付けるかも?)
  2. userid(整数)
  3. userelement(ユーザーの情報を載せたい要素)」
    の三点セットをまとめて保存して置く場合などに用います。
class User{
  constructor(name, id, element){
    if(name==null){
      this.name='名無しのユーザー';
    }
    else{
      this.username=name;
    }
    this.userid=id;
    this.userelement=element;
    this.update();
  }
  update(){
    this.userelement.innerHTML = this.username;
  }
  changeName(name){
    this.name = name;
    this.update();
  }
}

const userelements = document.querySelectorAll('#sunbreak_username');
const users = [];
for(let i=0; i < userelements.length; i++){
  users.push(new (null, i, userelements));
}

//その後、どこかのタイミングで名前を変更したくなった場合
users[0].changeName("太郎");
users[1].changeName("花子");
//changeNameするだけで、「users[0].nameが書き換えられ、同時にHTMLも更新される」

classの正しい使い方が分かれば、constructorの意味も理解できるのではないでしょうか?

1

貴方の考察通りひとつはプロパティの初期化に用いられます。

他にはMDNのコンストラクタにも書かれていますのて簡単にふれておきます。

classを習っているなら同時にextends(継承)も解説されているとは思いますが、継承した親クラスのコンストラクタを必要に応じてsuperで呼び出す事ができます。

  • superならクラス内であれば何処でも親クラスのメソッドを呼び出すことができます
  • super(param...);は子クラスのコンストラクタ内でしか使えません

意識しすぎてコンストラクタになんでもかんでも詰め込みすぎるとスパゲティになりやすく、あくまで単純な初期化機構として扱うのがベストです。
理解されているとは思いますがそもそも必要ないのであれば省略可能です。

0

Your answer might help someone💌