クラスを用いる言語(java)における継承のメリット
・コード再利用の仕組み
新しく作るクラスが既存のものとほぼ同じなら、差分だけを定義すればよい
・型システムの仕様を含んでいる
→明示的にキャストを行う必要性から解消される
js
キャストは存在しない
オブジェクトの継承関係も重要でない
「重要なのは何を継承しているかでなく、何ができるか」
jsはプロトタイプ型の言語
→ オブジェクトが他のオブジェクトから直接継承される
5.1 疑似クラス型
jsプロトタイプ クラス型をまねたいくつかの構文をまねしたため、かえってわかりづらくなっている
あるオブジェクトからほかのオブジェクトへ直接継承を行う代わりに、オブジェクトがコンストラクタ関数によって生成する不必要なステップがある
関数オブジェクト生成時
・関数オブジェクト生成するFunctionコンストラクタ 内部的に↓を実行
this.prototype = {constructor: this};
コンストラクタであるかにかかわらず、すべての関数はプロトタイプオブジェクトを保持する
→なぜならこの言語には、どの関数がコンストラクタとして使われるためのものなのか区別する方法がない
constructorプロパテぃは役に立たない。重要なのはprototypeオブジェクト
コンストラクタ関数を使う際二生じる危険
コンストラクタ関数を呼び出す際にnewをわすれると、thisには新しいオブジェクトがせっとされなくなる
かわりにthisにはグローバルオブジェクトがせっとされてしまい、しかも警告が出ない
この問題を緩和するため
・すべてのコンストラクタ関数は先頭を大文字にそれ以外のものは先頭をおおもじにしない
・もっといい方法は、newをいっさい使わない
jsの継承方法で、もっといい選択肢がある
5.2オブジェクト指定子
コンストラクタが受け取るパラメータが多くなってしまうことがある
引数の順番を覚えるのが大変
パラメータの数が増えそうなときには、コンストラクタがオブジェクト指定子を受け取るように設計する方がわかりやすい
オブジェクト指定子 = オブジェクトを生成するにあたっての設定が格納されたオブジェクト
var mObjec = maker(f, l , m, c, s);
⬆のかわりに
var myObject = maker({
first: f,
last: l,
middle: m,
state: s,
city: c
});
とする
・引数の指定の順序をきにしなくてよい
・コンストラクタがデフォルト値をよういしていれば引数省略できる
・コード可読性があがる
JSONを利用している場合にはさらにメリットがある
5.3プロトタイプ型
5.4 関数型
いままでの継承パターンの持つ弱点
プライバシーがない