nodejsでC#のDynamicObjectみたいなんやってみた。
v8に、SetNamedPropertyHandlerって関数があって、Objectに対する名前付きプロパティを読み書きするときとかに任意の関数を呼び出してくれるいい感じな機能があるらしい。じゃぁプロパティ読み書きしたら裏の別なDBたたけるね、ってことで作ってみたのがこれ。
var Dynamic = require('dynamic'); var obj = new Dynamic({ get: function(name){ return 100; } }); console.log(obj.hoge); // 100 console.log(obj.fuga); // 100 console.log(obj.piyo); // 100
どのプロパティ読んでも必ず100が帰ってくるObject。なんでこれをしようと思ったかというと、オブジェクトのプロパティ読み書きしたらいい感じに裏側のRedisにつながってるとおもしろそうだったから。
実際にためしてみようということでこういうのを用意。
var Dynamic = require('dynamic'); var deasync = require('deasync'); var Redis = function(client_, async_){ var inner = { client: client_. get: function(n){ if(async_) return function(f){ this.client.get(n, f); }; var ret, got; this.client.get(n, function(e,r){ ret = r; got = true; }); deasync.loopWhile(function(){ return !got; }); return ret; }, set: function(n, v){ this.client.set(n, v); }, close: function(){ this.client.quit(); } }; return new Dynamic(inner); }; module.exports = Redis;
こんなかんじで使ってみました。
var RedisWrapper = require('redis-wrapper'); var redis = require('redis'); var client = new RedisWrapper(redis.createClient()); client.a = "Hello, world!"; client.b = 3; console.log(client.a); // Hello, world! console.log(client.b * 2); // 6 client.close();
まとめ
こういうライブラリ見つけられなかったのですが、たぶんすでにあるはずなので誰か教えてください