JavaScriptで配列かハッシュかを区別するには?(その2)

この2つの記事を読んで、配列には length プロパティがあるが、ハッシュには length プロパティがないことを知った。

var obj;
obj = [ 'value' ];         alert(obj.length);  // 1         が表示される
obj = { 'key': 'value' };  alert(obj.length);  // undefined が表示される

これを利用すれば、

if (obj.length)
    // 配列
else
    // ハッシュ

でいけそうな気もしたが、この判定にも一つ問題があり、

var obj = { 'length': 'value' };
if (obj.length)
    // 配列     → obj はハッシュなのにこっちの制御に入ってしまう
else
    // ハッシュ

ハッシュに 'length' というキーを持てない、という制限が付いてしまう。

じゃあ他に、渡されたオブジェクトが配列かハッシュかを区別する方法がないものだろうかと探していたら、

if (Array.prototype.isPrototypeOf(obj))
    // 配列
else
    // ハッシュ

で、うまく動いた。(IE7 と Firefox2 で確認。)
しかし、 isPrototypeOf の意味がよく分かっていないので調べてみたいと思う。