H2Databaseを追っかけていたりしたブログ

H2 database のリリースノートを読んだりとか。

dojo toolkitやってみる 3

dojo/aspectの3つの関数のうち、aroundを使ってなかったので使ってみる。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Tutorial: Hello Dojo!</title>
  </head>
  <body>
    <h1 id="greeting">Hello</h1>
    <h1 id="greetingJa">こんにちは</h1>
    <!-- load Dojo -->
    <script src="dojo/dojo.js"
      data-dojo-config="async: true"></script>
    <script>
      require(['dojo/dom','dojo/aspect','dojo/domReady!'], function(dom,aspect){
        aspect.around(dom, 'byId', function(/*元のfunctionもしくは次に実行されるべきadvise*/original){
          return function(id){
            //aroundはこのfunctionが呼ばれたときに代わりに実行されるべきfunctionを返します。
            console.log('before');
            //元のfunctionを呼ぼうとしてdom.byId(id)とやると死ぬる
            var ret = original.apply(this,[id]);
            console.log('after');
            return ret;
          }
        });
        var x = dom.byId('greeting');
        x.innerHTML += ' World';
      });
    </script>
  </body>
</html>

after,around,beforeの使い分けは、下記のような感じになるかと思います。

before: functionの呼び出し前に別の処理を行いたい、引数を加工したい
after: functionの呼び出し後に別の処理を行いたい、返り値を加工したい
around: functionの前後に処理を挟みたい、場合によっては元のfunctionの呼び出しを行わなくしたい

javascriptaopjavaに比べたら全然実装しやすいとは思いますが、元々仕組みが用意されていると言うのは良いですね。