もうnw.jsとはほとんど関係のない内容になってきているような。
関数名(オブジェクト名)の取得は難しいと昨日書いたが、小飼弾さんのブログにそれに関してのポストがあった。ちょっと古い記事だが。
404 Blog Not Found:javascript - typeof()を再発明する
404 Blog Not Found:javascript - 関数名の取得とtypeof()の再々発明
ここに書いてあるコードを使うと無名関数以外であれば関数名を取得できるようだ。three.jsは意図的にconstructorプロパティにコンストラクタ関数を代入しているが、このあたりのサポートのために入れているのかな。このポストを読んで思ったのはjavascriptでリフレクション的な操作はできないことはないということ。なぜかというとfunctionオブジェクトはソースの状態で入手できるのだから、それを解析すれば構造は把握できるのだ。つまりjavascriptパーサーを自前で作るような意気込みでやればなんとかなりそうな気もする。javascriptで実装されたjavascriptパーサーはネット転がっていそうだけれどもね。あとで探してみよう。
それはさておきこれを使えばシリアライズコードももう少し簡潔に書けるかもしれないね。
それと昨日すこし感動したのはコンストラクタ関数をapplyするというもの。
Stack Overflowでも類似の記事を発見したんだけれども、空のオブジェクトを作ってそれにコンストラクタ関数をapplyするというような記事だった。これ使うと引数を配列にして保存しておけば復元できるのでシリアライズされたデータのサイズを縮小できるというメリットがある。その分シリアライズされたデータの可読性が下がるわけだが、3Dデータは膨大な頂点情報を持つので可読性をある程度犠牲にしてもデータ縮小にこだわる必要はある。
昨日今日で得た知識を使ってシリアライズコードを最適化していくことにする。