Kanasan.JS の JavaScript 第 5 版 (サイ本) 読書会 #4 に行ってきました (参加者のブログ記事一覧、当日のチャットログ)。
開始 15 分ほど前に会場に着いたのですが人気なし。特に名前のない貸し会議室とのことで、本当にここであってるのか Twitter で他者の動向を探ろうとするも、運悪く Twitter がダウン中。携帯から必死に地図を探していたところにほかの人が到着して一安心となりました。
開始時点で Windows マシン使用者が私を含めて 2 人という脅威のMac率でした。無線 LAN の共有も Mac 機を主体に行われ、そのせいか Windows 機では無線 LAN が利用できず。私は結局 Kanasan さんの EMOBILE 端末を借りてネットに接続しました。
JavaScript にクラスベースオブジェクト指向言語でいうところのクラスという概念は存在しませんが、サイ本では便宜的にクラスという言葉を使っています。
JavaScript でクラスを模倣する際に使われるのがプロトタイプ (ペアレント) です。クラスベースオブジェクト指向を多平面モデルで説明するのなら、プロトタイプベースオブジェクト指向は平面がひとつしかないという感じでしょうか。オブジェクトとそのプロトタイプは、平面間の垂直関係ではなく、同一平面内のつながり (プロトタイプチェーン) として表現できます。
あるオブジェクトから delete 演算子で foo プロパティを削除すれば、それにより隠されていたプロパティ (そのオブジェクトのプロトタイプの foo プロパティ) を再び参照できるようになります。
var d = new Date();
d.toString(); // => Sat May 24 2008 12:00:00 GMT+0900 (JST)
d.toString = function () { return this.getDate() + " 日"; };
d.toString(); // => 24 日
delete d.toString;
d.toString(); // => Sat May 24 2008 12:00:00 GMT+0900 (JST)
function Class() {
this.f = function () {};
}
Class.prototype.g = function () {};
var instance = new Class();
instance.h = function () {};
f、g、h のいずれもクラスベースオブジェクト指向でいうインスタンスメソッドに相当しますが、一般的には g の形 (プロトタイプのプロパティとして関数オブジェクトを設定) がよく使われます。
Java にならって比較可能なオブジェクトに compareTo メソッドを実装するというお話。that という引数名が読みやすいです。
Class.prototype.compareTo = function (that) {
return this.x - that.x || this.y - that.y;
};
コンストラクタ関数の prototype プロパティにスーパークラスのインスタンスを設定することで、クラスベースオブジェクト指向における継承を模倣できます。
function Super() {}
function Sub() {}
var subPrototype = new Super();
Sub.prototype = subPrototype; // (a)
// 通常は下のように 1 行で書く
// Sub.prototype = new Super();
var subInstance = new Sub();
Super.prototype.foo = 42;
subInstance.foo; // (b)
セコメントをする