【JavaScript】オブジェクトの階層(継承)を視覚的に表示してみる
更新日:2023/04/19
JavaScriptはclass構文の導入でプロトタイプチェーンの階層を構築しやすくなりました。
生成されたオブジェクトは、各階層で継承したオブジェクトの名前を保持しています。
今回はこの特徴を利用して、オブジェクトの階層(継承)を視覚的に表示してみます。
作成したコード
まずは、オブジェクトを生成したコンストラクタ関数の名前を取得します。
これは、【JavaScript】組み込みやAPIオブジェクトの名前を取得する方法で紹介したコードをそのまま使用します。
オブジェクトを生成したコンストラクタ関数の名前を取得
const getObjectName = obj =>{
if( typeof obj !=="object" ) return typeof obj;
const proto = Object.getPrototypeOf(obj);
return typeof proto?.constructor !== "function" || proto.constructor.name === undefined
? "object" : proto.constructor.name;
};
次に、プロトタイプチェーンを辿りながら、上の関数を呼び出します。
プロトタイプチェーンを辿る
const getObjectInheritance = obj =>{
const loopCheck = new WeakSet( [Object.prototype] ); // ループ監視&最終階層は除外
const result = [];
do{
loopCheck.add( obj ); // WeakSetに追加
result.push( getObjectName(obj) ); // 階層名を取得して配列に追加
obj = Object.getPrototypeOf( obj ); // プロトタイプを取得
}while( !loopCheck.has( obj ) // ループしていない?
&& obj !== null
&& typeof obj === "object" // 取得したプロトタイプはオブジェクト?
);
return result;
};
typeof null は"object"なので、個別にチェックする必要がありますね。
めんどくさい。
これで、完成です。
テスト
作成した関数をテストしてみます。
const B = class{
propB = 1;
};
const A = class extends B{
propA = "A";
};
const a = new A();
console.log( getObjectInheritance(a) );
// 結果: [ "A", "B", "Object" ]
各階層の名前を配列で取得できました。
次はDOMのDIV要素を見てみます。
console.log( getObjectInheritance( document.createElement( "div" ) ) );
// 結果: [ "HTMLDivElement", "HTMLElement", "Element", "Node", "EventTarget", "Object" ]
おー、こうなっていたのかー。
感動ですね。
期待したほど視覚的ではない?
これで十分ですよね?
更新日:2023/04/19
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。