assaulter's diary

主にバイクについて

JavaScript The Good Partsを読む(その2)

前回:JavaScript The Good Partsを読む(その1)

に引き続き、第三章を読み進めていきます。

3.5 プロトタイプ

JavaScriptまともに書いたこともなかったので、正直なところ、prototypeの存在は知りませんでした。間違いがありましたら指摘していただけると助かります。

/* 書籍より引用 */
すべてのオブジェクトは、プロトタイプオブジェクトとリンクしており、プロパティを継承している。
オブジェクトリテラルによって作られたオブジェクトはすべて、Object.prototypeオブジェクトとリンクしている。

オブジェクトを作る際には、プロトタイプとするオブジェクトを選択することができます。書籍では、Object関数に、

"引数として受けとったオブジェクトをプロトタイプとする、新しいオブジェクトを生成するメソッド"

を追加するサンプルがあったのでそれで遊んでみました。

サンプル1

// オブジェクトリテラルを利用してオブジェクトを作成
var person = {
    firstName: "Sakuya",
    lastName: "Izayoi"
};

if (typeof Object.create != 'function') {
    // Object関数にメソッドを追加
	Object.create = function (o) {
		// 関数Fを定義
		var F = function () {};
		// Fのプロトタイプにoを定義
		F.prototype = o;
		// コンストラクタ呼び出し(4.3で紹介)
		return new F();
	};
}

// personオブジェクトをプロパティとする新しいオブジェクト
var another_person = Object.create(person);

another_person.firstName // "Sakuya"
// Object.prototypeに定義されているisPrototypeOfメソッドをつかう。
// personオブジェクトは、オブジェクトリテラルを利用して作成されてので、Object.prototypeとリンクしている。
person.isPrototypeOf(another_person); // trueを返す

プロトタイプとのリンク

オブジェクトに修正を加えても、プロトタイプオブジェクトの内容が変更されることはない。

サンプル2(サンプル1に加筆)

// another_personオブジェクトにプロパティを追加
another_person.nickName = 'パッド長';

another_person.nickName // パッド長
// プロトタイプには影響しない
person.nickName // undefined

プロトタイプにプロパティを追加すると、そのオブジェクトをプロパティとするオブジェクト全てにおいてアクセス可能となる。

サンプル3

// プロトタイプオブジェクトにプロパティを追加
person.weapon = 'ナイフ';
// プロトタイプにアクセス可能・・・!ということ・・・!
another_person.weapon // ナイフ

3.8 プロパティの削除

delte演算子を用いて、オブジェクトからプロパティを削除することができます。(Object.prototype内のプロパティに対しても適用できますが、なんの役に立つかはわかりません。)

サンプル4

another_person.weapon = 'ザ・◯ールド';
// プロトタイプのプロパティと同名のプロパティを定義できる。
another_person.weapon // ザ・◯ールド
// プロパティの削除
delete another_person.weapon;
// プロトタイプのプロパティが見える
another_person.weapon // ナイフ

 

たまにJSの記事を読んでいると、'クラス'というキーワードが出てきますが、このプロトタイプのことを指しているのかなぁという印象を持ちました。次回からは、お待ちかねの関数について勉強していきます。