JavascriptのObject,Class,Constructorを27分57秒で完璧に理解する記

## JavascriptはObjectで出来ている

**JavaScriptをやればやるほど、JavaScriptの全てがオブジェクトで出来ている**事を思い知らされる。
データを保存したり、キープする際にはオブジェクトを使うし、APIやデータベースとやりとりする際につかうJSONフォーマットもオブジェクトだし、各種ライブラリもオブジェクトとして配布されているし、DOMのノードもオブジェクトとして、DOCUMENTオブジェクトに入ってるし、JavaScriptのビルトイン関数やプロパティも全てオブジェクトとして保存されてるし、プロミスもオブジェクトで返ってくる。
**JavaScriptを理解したければ、オブジェクトを理解するのは必須で、オブジェクトを意識してJavaScriptを書けば、理解のスピードも桁違いだ。**

で、自分も理解しているつもりだったんだけど、この動画をみてさらに理解が深まったというか、目からウロコが落ちて見通しがさらにくっきりした様な気分になったので、是非JavaScriptを勉強中の諸君にもシェアしたいと思い、これを書いているのです。

![-212- 6-2- Classes in JavaScript with ES6 - p5-js Tutorial - YouTube 6-3-2022 5-46-22 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204968/89d68ecb-20f3-1034-2533-aa4ab5d23f31.png)


動画のスンダー・ピチャイ似のオッサンはP5.jsというJavaScriptライブラリを使っているので見慣れない関数なんかが出てくるけど、本質は同じなので、あんまり気にせずに、コアの部分を理解してもらえれば良いと思うで。
動画では、例として、泡のアニメーションを作ってらっしゃる。

## オブジェクトとクラスを理解する

今更だけど、オブジェクトってこれのことね。属性や動き（関数）をひとまとめに保持しておける。
```javascript
const inokiObject = {
   name : 'Antonio Inoki',
   age : 18,
   occupancy : 'wrestler',
   country : 'japan',
   waza : 'cobra twist',
  
   bombaye(){ 
       return this.name + " Bombaye!!!, 1, 2, 3, Daaaaaaaaa!!!!!" ; 
   } 
}
```

 例えば、無数の泡が動き回る様なアニメーションを作りたい場合、その泡オブジェクト一個一個の属性を設定し、関数を設定していたら、大変なことになる。
**泡の原型を一個作って、それをコピー出来たら良いよね。**
で、そうゆう時に便利なのが、クラスとコンストラクタで、それを使って、泡クラスを作るのだ。

**クラス（オブジェクト指向）の基本は”カプセル化”。** あるモノの情報をひとまとめのパッケージにして、カプセルの中に入れておける。
で、まず”泡とは何なのか”？という事を定義しないといけない。**哲学的だね。**
大きさは？ポジションは？色は？赤ちゃんバブルはどうやって生まれるのか？どんな風に動くのか？
で、それをクラスの中に定義する。
```javascript
class Bubble {
 
泡とはこういうものやで
 
}
```

で、それを元にこうやってインスタンスを作る。簡単だよね。
```javascript
const bubble1 = new Bubble();
```

***重要なのは、クラスはいわば設計図。情報が書かれているだけで、実体はない。***
***そこから作られたインスタンスになって、初めて実態になる。***
例えれば、クラスはクッキーカッターで、その型で抜かれて初めてクッキーっていう実態になる。

インスタンスを生成する時には、newキーワードをつける。そうすると、後に続くクラスの中の関数が起動する。どの関数か？**constructor関数である。** で、Bubbleちゃんが形を伴って召喚されるわけだ。

では、実際にどういう風に書いていくかを説明するよ。
```javascript
class Bubble{
   constructor(){
       this.x = 100;
       this.y = 100;
       this.size = 2;
   }
}
```
**constructor()関数は、属性をセットアップする特殊な関数**で、前述の様に、newキーワードによって、起動する。
**thisは、このオブジェクト内(インスタンス)の**という意味。
これで、泡のポジションと大きさという**属性**がセット出来たね。

で、次は泡がどう動くのかという**動きの部分**を定義しよう。
```javascript
class Bubble{
   constructor(){
       this.x = 100;
       this.y = 100;
       this.size = 2;
   }
 
   move(){
       this.x = this.x + random(-5, 5);
       this.y = this.y + random(-5, 5);
   }
 
   show(){
       stroke(255);
       strokeWeight(4);
       noFill();
       ellipse(this.x, this.y, 24, 24);
   }
}
```
泡がどの様に動くかと、どの様に現れるのかを定義。いたって普通の関数。
これで、**泡がどうゆう形態のもので、どうゆう動きをするかという設計図**が出来た。

で、その設計図から、newキーワードで幾らでも泡（インスタンス）を生成し、動かすことが出来る。
```javascript
const bubble1 = new Bubble();
const bubble2 = new Bubble();
 
function draw(){
   background(0);
   bubble1.move();
   bubble1.show();
   bubble2.move();
   bubble2.show();
}
 
draw();
```

![-212- 6-2- Classes in JavaScript with ES6 - p5-js Tutorial - YouTube 6-3-2022 6-39-45 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204968/905a0f7e-8392-3097-92c3-5729c9816a3e.png)

## 引数の設定

ここからは、少し応用というか、コンストラクタに引数を使って、もっとランダムな泡がランダムに動く様にしてみよう。

```javascript
class Bubble{
   constructor(x, y, r){
       this.x = x;
       this.y = y;
       this.r = r;
   }

   move(){
       this.x = this.x + random(-5, 5);
       this.y = this.y + random(-5, 5);
   }
 
   show(){
       stroke(255);
       strokeWeight(4);
       noFill();
       ellipse(this.x, this.y, this.r * 2);
   }
}
```

```javascript
const bubble1 = new Bubble(200, 200, 40);
const bubble2 = new Bubble(400, 200, 20);

function draw(){
   background(0);
   bubble1.move();
   bubble1.show();
   bubble2.move();
   bubble2.show();
}
 
draw();
```
これで、２つの違う大きさを持った泡が生成され、ランダムに動くアニメーションが出来た。
![-212- 6-3- Constructor Arguments with Classes in JavaScript - p5-js Tutorial - YouTube 6-3-2022 7-09-05 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204968/4dda9a70-1444-479e-3a27-80c51a774d70.png)

オリジナルの動画はこちら↓儂の書いた拙文を読んだ上で見ると、分かりやすいと思うぞ。

<iframe width="560" height="315" src="https://www.youtube.com/embed/T-HGdc8L-7w" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<iframe width="560" height="315" src="https://www.youtube.com/embed/rHiSsgFRgx4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>