はじめに
nullsafe-objectというnpmライブラリを公開したので紹介します(手前味噌かーい)。
概要
オブジェクトの深い階層のプロパティに 自然な形で安全に アクセスする方法を提供するライブラリです。
Example
const NullSafeObject = require('nullsafe-object');
const srcObj = {};
// 空のオブジェクトなので普通に下のようにアクセスすると
// Uncaught TypeError: Cannot read property 'info' of undefined
// とか言いながら死ぬ
// console.log(srcObj.deep.property.access);
// NullSafeObjectで包む
const obj = NullSafeObject.wrap(srcObj);
// 深い階層にアクセスして unwrap() メソッドで結果を取得できる
console.log(obj.deep.property.access.unwrap()); // => null
// 存在するプロパティにももちろんアクセスできる
const srcObj2 = {
exists: {
property: 'some string'
}
};
const obj2 = NullSafeObject.wrap(srcObj2);
// unwrap() メソッドは必須
console.log(obj2.exists.property.unwrap()); // => 'some string'
// githubのREADMEに書くの忘れてたけどちゃんと代入もできる
obj.new_property = 'hoge';
// 元のオブジェクトに反映されている
console.log(srcObj.new_property); // => 'hoge'
インストール方法
いつもの
npm install --save nullsafe-object
yarn add nullsafe-object
実現方法
ES2015で追加されたProxy
を使用しています。Proxy
についてはこちらの記事が参考になります。あとはMDNとかを見ていただきたいきもち。
対応ブラウザはこのへんを見ると良いと思います。IE11ってなんですか?。
NullSafeObject.wrap
は内部でNullSafeObject
のインスタンスを作成しており、作成されたインスタンスをProxy
に渡してプロパティアクセスをフックする処理が書いてあるみたいな感じです。
プロパティアクセスをフックすると「どのキーにアクセスしたか」がわかるので、アクセスしたキーを順番に保存していきます。
NullSafeObject#unwrap
を呼び出すと、元のオブジェクトから、保存したキーを順番にたどっていき、途中でnull
だったりundefined
だったりしたらnull
を返すようにしています。
代入もフックできるので、いいかんじにやってます(キーボード打つのにつかれてきた人が書く解説)(そのうち編集しなきゃ)。
なぜ作ろうかと思ったか
ぶっちゃけProxy
で何か面白いことできないかなって思ったのが9割くらいですね。
あとは前々から途中にnull
やらundefined
があってしぬみたいなことがあってストレスが溜まってたのが残りの1割(?)
(実は、全然難しい実装ではないのになんで作られていなかったんだろうと心配になっています。知らないだけで類似ライブラリあったのかな・・・)
これから対応したい機能
-
Array#map
とかの呼び出しにも対応したい(できるのか不明)(テストコードだけ書いて対応してないせいでテストがしんでる) -
=> 対応しましたobj._root
obj._path
とかやると、もとのオブジェクトの_root
や_path
ではなく、クラス内部で使用している管理用オブジェクトに触れることができてしまうのでそれをなんとかしたい(方針は立っていて、Symbol
を使えば良さそう)
さいごに
使用感の報告やIssueやプルリクをいただけると泣いて喜びます!