okknパッケージを作ってみた2〜インスタンスメソッドとスタティックメソッドの区別〜

インスタンスフィールドにアクセスしないスタティックメソッドは、メモリ削減のためプロトタイプ側に定義した。

okkn.js

if(okkn === undefined) {
    var okkn = {};
}
if(okkn.util === undefined) {
    okkn.util = {};
}

(function() {

    //*** パッケージ間共通プライベートオブジェクト ***//

    /**
     * デフォルト出力先にメッセージを出力します。
     * @param str メッセージ
     */
    function outputToDefault(str) {
        if(console.log) {
            console.log(str);
        }
        else {
            alert(str);
        }
    }


    /**
     * ログに関するパッケージです。
     */
    okkn.util.log = (function(){

        //*** パブリックオブジェクト ***//

        return {

            /**
             * ログ機能のインスタンスを生成します。
             */
            createLogger: function(str, outputFunc) {
                var _outputFunc = outputFunc;
                return {
                    log: function(str) {
                        if(_outputFunc) {
                            _outputFunc(str);
                        }
                        else {
                            outputToDefault(str);
                        }
                    },
                    setOutputFunc: function(outputFunc) {
                        _outputFunc = outputFunc;
                    }
                };
            }

        };

    })();


    /**
     * 性能に関するパッケージです。
     */
    okkn.util.performance = (function(){

        //*** パッケージ内共通プライベートオブジェクト ***//

        /**
         * デフォルトメッセージを取得します。
         * @param result 計測結果オブジェクト
         */
        function _getDefaultOutputString(result) {
            return '[debug]' + result.id +': ' + result.milliTime + '(ms)';
        }

        /**
         * 複数結果用のデフォルトメッセージを取得します。
         * @param result 計測結果オブジェクトリスト
         */
        function _getDefaultOutputStringForAll(resultList) {
            var str = '';
            for(var i = 0, len = resultList.length; i < len; i++) {
                var result = resultList[i];
                str += _getDefaultOutputString(result);
                if(i + 1 < len) {
                    str += '\n';
                }
            }
            return str;
        }

        //*** パブリックスタティックオブジェクト ***//
        
        /**
         * SpeedTesterのプロトタイプオブジェクトです。
         */
        var SpeenTesterStatic = {
            alertCopyRight: function() {
                alert('CopyRight');
            }
        };

        //*** パブリックオブジェクト ***//

        return {

            /**
             * 性能計測機能 SpeedTester のインスタンスを生成します。
             */
            createSpeedTester: function() {

                //*** インスタンスプライベートオブジェクト ***//

                var start = {};
                var end = {};

                //*** インスタンスパブリックオブジェクト ***//

                function SpeedTester() {

                    /**
                     * 性能計測を開始します。
                     * @param id 計測を一意に識別するための文字列。同時に複数の計測を行わない場合は省略可能
                     */
                    this.setStart = function(id) {
                        start[id] = new Date().getTime();
                    };

                    /**
                     * 性能計測を終了します。
                     * @param id 計測を一意に識別するための文字列。同時に複数の計測を行わない場合は省略可能
                     */
                    this.setEnd = function(id) {
                        end[id] = new Date().getTime();
                    };

                    /**
                     * 性能計測結果を出力します。
                     * @param id 計測を一意に識別するための文字列。同時に複数の計測を行わない場合は省略可能
                     * @param outputFunc(result) 計測結果出力用関数。引数は、{id:計測id文字列, milliTime: 計測結果数値(ミリ秒)}。
                     *                           省略した場合は、デフォルト出力先にデフォルトメッセージを出力
                     */
                    this.outputResult = function(id, outputFunc) {
                        var milliTime = end[id] - start[id];
                        var result = {id: id, milliTime: milliTime};
                        if(outputFunc) {
                            outputFunc(result);
                        }
                        else {
                            var str = _getDefaultOutputString(result);
                            outputToDefault(str);
                        }
                    };

                    /**
                     * すべての性能計測結果を出力します。
                     * @param outputAllResultsFunc(result) 計測結果出力用関数。引数は、{id:計測id文字列, milliTime: 計測結果数値(ミリ秒)}のリスト。
                     *                                     省略した場合は、デフォルト出力先にデフォルトメッセージを出力
                     */
                    this.outputAllResults = function(outputAllFunc) {
                        var resultList = [];
                        for(var id in end) {
                            var milliTime = end[id] - start[id];
                            resultList.push({id: id, milliTime: milliTime});
                        }
                        if(outputAllFunc) {
                            outputAllFunc(resultList);
                        }
                        else {
                            var str = _getDefaultOutputStringForAll(resultList);
                            outputToDefault(str);
                        }
                    };

                    /**
                     * すべての計測結果を消去します。
                     */
                    this.clearAllResults = function() {
                        start = {};
                        end = {};
                    };

                }

                SpeedTester.prototype = SpeenTesterStatic;
                return new SpeedTester();

            }

        };

    })();
})();

使用例

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
  <HEAD>
    <TITLE>okkn.util動作確認</TITLE>
      <SCRIPT src="http://code.jquery.com/jquery-1.6.2.js"></SCRIPT>
      <SCRIPT src="./jquery.appendchildren.js"></SCRIPT>
      <SCRIPT src="./okkn.js"></SCRIPT>
      <SCRIPT type="text/javascript">
        //<![CDATA[
          $(function(){
              var st = okkn.util.performance.createSpeedTester();
              st.alertCopyRight();
              var logger = okkn.util.log.createLogger();
              
              logger.log('開始');

              st.setStart('appendChildren table, w5, d5');
              $('body').appendChildren({nodeName:'table', width:5, depth:5});
              st.setEnd('appendChildren table, w5, d5');
              
              logger.log('終了');
              st.outputAllResults();
          });
        //]]>
      </SCRIPT>
  </HEAD>
  <BODY>
  </BODY>
</HTML>