JavaScript 第5版 - 9章 クラスとコンストラクタとプロトタイプ(4)

JavaScript 第5版、「9章 クラスとコンストラクタとプロトタイプ」の「9.6 継承以外のクラス拡張法」~「9.8 例:defineClass()ユーティリティメソッド」(173~182ページ)を読み進めていきます。

9.6 継承以外のクラス拡張法

サブクラスや継承による拡張を行わなくても、別のクラスで使っている関数をコピーして借りることができます。以下は、borrowFromオブジェクトのプロトタイプオブジェクトからaddToオブジェクトのプロトタイプオブジェクトにメソッドをコピーすることで、borrowFromオブジェクトが持つメソッドをaddToオブジェクトでも利用できるようにする例です。

function borrowMethods(borrowFrom, addTo) {
    var from = borrowFrom.prototype;
    var to = addTo.prototype;

    for (m in from) {
        if (typeof from[m] != 'function') continue;
        to[m] = from[m];
    }
}

174ページの「例 9-5」には、他のクラスから利用される汎用メソッドを定義するミックスインクラスの例が掲載されています。コンストラクタに依存したクラスのメソッドを借用したい場合は、借用する側のクラスのコンストラクタ内などで、借用される側のクラスのコンストラクタをcallメソッドなどを利用して呼び出します。この方法を上手く利用すると、多重継承に似たようなこともできます。

9.7 オブジェクトクラスの判定

9.7.1 instanceof演算子とコンストラクタ

  • instanceof演算子で、オブジェクトがどのクラスのインスタンスであるかはわかるが、どのクラスの直接のインスタンスであるかはわからない。オブジェクトがあるクラスの直接のインスタンスであるかどうかは、constructorプロパティを調べる。

例えば、関数fに対してinstanceof演算子を使った場合、次の式は全てtrueとなります。

typeof f == 'function'
f instanceof Function
f instanceof Object

9.7.2 Object.toString()メソッドによる型判定

  • 未知のクラスについて調べたい場合、instanceof演算子やコンストラクタでは調べられないが、Object.toString()メソッドを使うと良い。組み込みオブジェクトのクラス情報を知ることができる。
// toString()メソッドがオーバーライドされている可能性があるので、
// Object.prototype.toStringを明示的に参照する。
Object.prototype.toString.apply(obj);

ただし、ユーザ定義のクラスではtoString()メソッドで期待する結果は得られません。。これらに対応出来るように、typeofを拡張した関数が178ページの「例 9-6」に掲載されています。

9.7.3 ダックタイピング

  • あるオブジェクトが、あるクラスで定義されているメソッドを全て調べて実装していれば、そのオブジェクトはそのクラスのインスタンスである。このような型付けをダックタイピングと言い、あるオブジェクトがクラスXのプロパティを持っていれば、X()コンストラクタ関数で生成されたものでなくても、そのオブジェクトをクラスXのインスタンスとして扱うことができる。

オブジェクトの詳細について、それらを判別するための例がいくつか掲載されています。

9.8 例:defineClass()ユーティリティメソッド

182ページの「例 9-10」に、クラス定義用のユーティリティ関数が掲載されています。

9章はこれで終わりです。自分の書いたコードの改善できそうな点を思い浮かべながら読みました。この章はかなりおもしろかったです。

コメント (0)

この記事へのコメントはまだありません。

コメントフォーム

トラックバック (0)

この記事へのトラックバックはまだありません。

この記事のトラックバックURI
http://dxd8.com/archives/89/trackback/
この記事のURI
http://dxd8.com/archives/89/