本棚管理のシステムを再現 classの概念を学ぶ
1.Bookshelfclassを作ってみる
-
constructor()内で以下のインスタンス変数を定義
-
本を格納する為の空の配列books
-
本の数を管理するbookCount(初期値0)
-
以下のメソッドを定義
-
addBook(title)→本を追加し、本の数をカウントアップする
-
getBookCount()→本の数を返す
-
ListBooks()→登録されている本のタイトルをカンマ区切りの文字列で返す
class Bookshelf { constructor () { this.books = []; this.bookCount = 0; } addBook(title) { this.books.push(title); this.bookCount += 1; }; getBookCount() { return this.books.length; }; listBooks() { return this.books.join(","); }; -
constructor内のthisはインスタンス自身を指す
-
インスタンスを生成した時、インスタンス自身のプロパティが
books,bookCountになるので、そこに対して値を設定する -
メソッド内では、自身のプロパティに対してはthisを付ける必要がある
-
クラス内でメソッドを定義する時は、objectのメソッドの様に
関数名:()=>{}では無く、関数名()=>{}で良い
2.Bookshelfクラスを拡張、本を削除できる機能を持つクラスを作成する
-
Bookshelfクラスを拡張しRemovableBookshelfクラスを作成する
-
constructor()内で親クラスのコンストラクタを呼び出す
- [ ] 以下のメソッドを持たせる
- removeBook(title)
本棚(books)の中から最初に見つかったtitleの本を削除する -
本を削除したらbookCountを1減らす
-
本が見つからない場合は何もしない
-
listBooks()
-
親クラスのメソッドをオーバーライドする
-
本棚(books)に本が1冊もない場合"本棚は空です"の文字列を返す
-
本がある場合、親クラスのlistBooks()と同じ動作をする
class RemovableBookshelf extends Bookshelf { constructor () { super(); } removeBook(title) { if(this.books.indexOf(title) !== -1) { this.books.splice(this.books.indexOf(title),1); this.bookCount --; } listBook() { if(this.books.length === 0) { return "本棚は空です" }else { return super.listBooks(); } } -
クラスを継承する時は子クラス extends 親クラスでクラスを定義する
-
クラスを継承した時、実はコンストラクターを呼ばなくても、裏側で親クラスのコンストラクターを実行してくれる
もし新たにプロパティを定義するときは、コンストラクターと、super()を呼ぶ必要がある -
splice()は要素を取り除く、置き換える、追加ができる
array.splice(1,1)は配列のindex=1から1つ要素を削除する -
親クラスのメソッドを使いたい場合は、super.親クラスのメソッド名で使用できる
3.RemovableBookshelfクラスを拡張し、お気に入り機能を持つクラスを作成する
-
RemovableBookshelfクラスを拡張したFavoriteBookshelfクラスを作成する
-
constructor()内で親クラスのコンストラクタを呼び出し、お気に入り管理用のオブジェクトfavoritesを初期化する
*favoriteオブジェクトは、初期化段階では空のオブジェクトを定義して良い
お気に入り登録の操作に応じてキーが追加されていく -
以下のメソッドを持たせる
-
removeBook(title)
-
親クラスのメソッドをオーバーライドする
-
本を削除する際に、お気に入り管理用オブジェクトfavoritesからも該当する本の情報を削除する
-
それ以外は、親クラスのremoveBook(title)と同じ動作をする
-
markFavorite(title)
-
本棚に存在する本なら、お気に入りとしてfavorites[title] = trueに設定、存在しない場合は何もしない
-
unmarkFavorite(title)
-
本棚に存在する本なら、お気に入りを解除し、favorites[title] = falseに設定、存在しない場合は何もしない
-
listFavorites()
-
favoritesに登録されていてtrueになっている本だけをカンマ区切りの文字列で返す
-
お気に入りが1冊も無い場合"お気に入りはありません"の文字列を返す
class FavoriteBookshelf extends RemovableBookshelf { constructor () { super(); this.favorites = {}; } removeBook(title) { if(this.books.indexOf(title) !== -1){ this.books.splice(this.books.indexOf(title),1); this.bookCount --; delete this.favorites[title]; } markFavorite(title) => { if(this.books.indexOf(title) !== -1) { faborites[title] = true; } unmarkFavorite(title) { if(this.books.indexOf(title) !== -1){ this.favorites[title] = false; } listFavorites() { const resultArray = []; for(const key in this.favorites) { if(this.favorites[key] === true) { resultArray.push(key); } } if(resultArray.length === 0) { return "お気に入りはありません" } return resultArray.join(","); };