JavaScript/本格入門本JavaScriptにおけるオブジェクト指向の特徴クラスではなくプロトタイプ他言語と違ってインスタンスの概念はあるものの、クラスがなくてプロトタイプという雛形の概念だけがある。プロトタイプとは要するに「より縛りの弱いクラスのようなもの」と思って差し支えない。{}これだけでクラス完成。あとはインスタンス化するだけ。この場合もgetNameは動作する。//エラー!mem2にgetNameはないのでエラー。同一のクラスを元に生成されたインスタンスでも、それぞれが持つメンバは同一とは限らないので注意。このようなゆるさが「より縛りの弱いクラスのようなもの」と言われるゆえんである。コンストラクタの問題点メソッドの数に比例して無駄なメモリを消費するのが問題。コンストラクタは、インスタンスを生成するたびに、それぞれのインスタンスのためにメモリを確保する。上述したgetNameでいえば全てのインスタンスで中身が同じなのでインスタンス単位でメモリを確保するのは無駄。これを解決するのがprototypeというプロパティ。prototypeを使うとインスタンスコピーしても、コピー元のメンバを見に行く=メモリ使用量を節約できる。2.メンバ追加や変更をインスタンスがリアルタイムに認識インスタンスにメンバをコピーしないということは、プロトタイプオブジェクトへの変更をインスタンス側で動的に認識できるということ。上述のコードでgetNameメンバを追加=>インスタンス化しているところを、インスタンス化=>getNameメンバ追加としても正常に動作する。プロタイプオブジェクトの不思議(プロパティの設定)プロトタイプオブジェクトでプロパティ宣言したら?→値の参照時だけプロトタイプオブジェクトが利用される。最後は女|女とならず、インスタンスmem2の内容だけが書き換えられる。値の設定は常にインスタンスに対して行われる。mem1のインスタンス自体にはsexプロパティがないので元のMemberクラスのデフォルトを見に行く。mem2のインスタンスにはsexプロパティが設定されているので「女」と表示される。※ただし、どうせインスタンス単位で値は異なるのが普通なので、このようにプロパティをプロトタイプオブジェクトで宣言する意味はない。(読み取り専用プロパティは別)通常は下記のようにする。・プロパティ宣言→コンストラクタにて・メソッド宣言→プロトタイプにて■静的プロパティ、静的メソッドの定義(インスタンス生成しなくてもオブジェクトから直接呼び出せるプロパティ、メソッド)プロトタイプには登録できない。コンストラクタ(オブジェクト)に直接追加する。Area();document.writeln();//エラー!オブジェクトからversionなどの静的プロパティ、メソッドが呼びだせているが、インスタンス経由で静的メソッドは呼びだせずにエラーとなる。これは静的メンバがあくまでArea関数オブジェクトに動的追加されているが、Areaが生成したインスタンスaには追加されてないため。■静的プロパティ、メソッド定義の注意2点1.静的プロパティは基本的に読み取り専用2.静的メソッドの中ではthisキーワードが使えない静的メンバを定義する理由はグローバル関数、変数を減らすため。mem2.sexとした場合、mem1にはsexプロパティがないためなにもされず、mem2.sexプロパティが削除される。結果として男|男と表示されることになる。インスタンス側でのメンバ追加削除などは元のプロトタイプオブジェクトにまで影響は及ぼさないということ。オブジェクトリテラルでプロトタイプを定義するここまではドット演算子でプロトタイプにメンバを追加してきたが、メンバ数が多い場合にコードが冗長化するので非推奨。上述のコードを例にすると下記のようにしたらよい。}};オブジェクトの継承(プロトタイプチェーン)元のオブジェクト(クラス)の機能を引き継いで新たなクラスを定義する機能。重複がなくなり、差分プログラミングだけで済む。継承元のクラスをスーパークラス継承されたクラスをサブクラスと呼ぶ。//トコトコ...d.bark();//ワンワン!DogインスタンスからAnimalオブジェクト定義のwalkを呼び出せている。(Dog自体にはwalkはない。)継承関係の変更は動的に可能JavaScript特有だが、動的に継承関係を変更できる。動的とはいえども、インスタンスが生成された時点でプロトタイプチェーンは固定され、その後の変更に関わらず保存されるので注意。//トコトコ最後は変更されていてもAnimalの方のトコトコが表示される。本格的な開発に備えるクラスライクな継承のしくみプロトタイプチェーンの継承は独特な概念であり、クラスベースのオブジェクト指向に慣れていると違和感がある。そこでクラスベースによく似た継承方法を紹介する。);//ここから先は一旦保留としておく。配列を扱う上で役立つライブラリ。»プロフィールid:hiromode某PR会社勤務。2015年からフロントエンド従事。自分でサービスを作り流行らせるのが目標。主なスキルはHTML,CSS,JavaScript(Vue.js、jQuery),インフラ(AWS、VPS)、CakePHP、Gitなど。備忘録アイデアのつくり方を読んだメモAWSからのメールが迷惑メールになるときWordpress+S3+Cloudfrontで実現する、冗長構成対応の画像配信とメディアアップロードしてS3保存Wordpress等のサイトが500エラーで突然見れなくなった時に疑うメモリ不足とSwap領域について月別アーカイブはてなブログをはじめよう!hiromodeさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。