ここ最近仕事の関連でJavascript(jQuery)を使っています。自分がJavascriptを使っていたのはもう10年近く前のことなのですが、改めて使ってみると10年という間の進化は凄いものですね。

ってことでここ最近で覚えたこと。

  • Javascriptの既定クラスの機能を拡張する
  • jQueryへ”ヘルパ関数”を追加する ($.extend)
  • jQueryへ”機能クラス”を追加する ($.fx.extend)
  • IMPACTJSを拡張する (ig.Xxxx.inject)

今回はその内の最初の既定クラスの機能拡張について。例えば、文字列に対してフォーマッター(printf(), format()のようなもの)が欲しい場合は以下のようにすると良いらしい。

String.format = function() {
  var s = arguments[0];
  for (var i = 0; i < arguments.length - 1; i++) {
    var reg = new RegExp("\\{" + i + "\\}", "gm");
    s = s.replace(reg, arguments[i + 1]);
  } 
  return s;
}

そして、よく使われる文字列の接頭辞、接尾辞が等しいかどうかを判断する関数は以下のようにすると良いらしい。

String.prototype.endsWith = function (suffix) {
  return (this.substr(this.length - suffix.length) === suffix);
}

String.prototype.startsWith = function(prefix) {
  return (this.substr(0, prefix.length) === prefix);
}

というのが、私が愛するサイトの一つであるstackoverflow (Equivalent of String.format in JQuery)に書いてる!

多分まとめるなれば

  • クラス関数を追加する場合は”クラス名.関数名 = function() { 定義 }”とすればよい。
  • インスタンス変数に関数を追加する場合は”クラス名.prototype.関数名 = function() { 定義 }”とすればよい。

だと思います。endsWith(), startsWith()はそれぞれ別個で書いてありますが、jQueryの機能を使えば恐らくは以下のようにもに書けるのではないかな、思ったり。でも詳しくないから知らない。

$.extend(String.prototype, {

endsWith: function(suffix) { 
  return (this.substr(this.length - suffix.length) === suffix);
}, 
startsWith: function(prefix) {
  return (this.substr(0, prefix.length) === prefix);
}

});

ってな感じなのですが、たま~に技術っぽいものを書くと違和感を覚える今日この頃。