javascript 第9章 クラス
javascriptでは同じプロトタイプオブジェクトから継承する一連のオブジェクトのことをクラスというんやって。
クラスってCSSでも出てきたみたいに同じプロトタイプオブジェクトに入ってるプロパティとかメソッドを継承できるイメージなんかなと思う。
ES6になってclass構文が出てきてんけどそれ以前にもクラスの概念はあったらしくて、そのときは新しいオブジェクトを初期化するコンストラクタ関数を定義してそのあと継承したいものをObject.prototypeで定義してからnew Object()で呼び出すみたいなめんどくさいことをしてたらしい。
ちなみに、メソッドやコンストラクタの定義の時にアロー関数は使ったらあかん。アロー関数はプロパティを持たへんからコンストラクタとして使用できへんし、アロー関数のthisは呼び出されたコンテキストから継承するので呼び出されたオブジェクトから継承させたい場合は不向きなんやって。
でclass構文が出てきてからは、
class Range {
constructor(from, to) {
...
}
includes() {
...
}
}
let r = new Range(1,3)
上記のようにめためたシンプルにかける。
class構文の特徴は、クラス本体の書き方がオブジェクトリテラルとにてるんやけど全然違うから気をつけることと(名前:値 のペアで書かれへん。)
また、constructorが関数名になるわけではなく、class宣言文ではclass名おなじ新しい変数が定義されて、その変数にconstructor関数の値が設定される。
classには静的メソッドっていうのがあってclass構文内でstaticを前につけてメソッドを定義するとつかえて、これはクラスメソッドとか言われたりするねんけど、宣言したクラス名のみでしか呼び出すことができないねんて。
で、意味わからん話がここにも出てくんねんけど、classにはフィールドっていう概念があってな意味的にはプロパティと同じらしいねんけど、三つのタイプがあってパブリックフィールドとプライベートフィールドと静的フィールドっていうのがあるねんて。パブリックフィールドは読み出し・書き込みができるプロパティのことでいままでつかってたもの。
プライベートフィールドは、読み出しも書き込みもできへんやつやねんて。変数のまえに「#」をつけるだけでできる。で上記の画像の通り書き込みできへんくてあとから60を追加したけど別のパブリックプロパティとして定義されてしまう。プライベートプロパティを呼び出したければ、ゲッターをつかって呼び出す。
で静的フィールドやねんけど2020年出版のサイホンやとまだ提案中のものらしいからとりあえず無視しとこっと。staticとプライベートフィールドを同時に使って、外部からアクセスできなくしつつ静的メソッドを定義することもできるねんて。
いきなり話変わるけど、extendをつかえばクラスをほかのサブクラスに継承することができる。ただ継承って簡単やねんけどいらないものまで継承できたりしてまうから、クラス内で使いたいクラスのインスタンスを作成して必要に応じて振る舞いを委譲するのがいいってサイホンには書いてて、確かに疎結合の方がええとおもうから俺も賛成。ちなみに委譲の場合はサブクラス化させてないところが肝。
いうてもサブクラス化させた方がいいときもあるねんて。それを抽象クラス・具象クラスって呼んでんねんけど、何がいいたいかってある処理を行うときに全部に対して共通のベーシックな部分を抽象クラスで定義して個々の処理は抽象クラスのサブクラスとしてextendして書いていくと後で他の人がコード見るときにわかりやすいから良い。
classって超いいじゃん。おれ使います。
この記事が気に入ったらサポートをしてみませんか?