[JavaScript]匿名メソッドを可能にするObject.prototype拡張
- 2007-10-18
- カテゴリ: Client Side
- タグ: JavaScript Tips
無名関数をメソッドとして使うには、Function.prototype.callやFunction.prototype.applyを使って↓のように書かなくてはいけない。
var arr = ['A', 'B', 'C'];
var str = (function(s) { this.push(s); return this; }).call(arr, 'D').join(', ');
window.alert(str); /* A, B, C, D */
これをどうしても↓みたいに1行で書きたかった。
var str = ['A', 'B', 'C'].a(function(s) { this.push(s); return this; }, 'D').join(', ');
と、いうことで書いたのが↓のメソッド。
/* anonymous methodのa */
Object.prototype.a = function() {
var method = arguments[0], args = [];
for (var i = 1, l = arguments.length; i < l; i++) args.push(arguments[i]);
return method.apply(this, args);
}
第1引数で渡した関数オブジェクトを、メソッドとして実行します。第2引数以降はそのまま引数として関数オブジェクトに渡されます。
この関数があれば、下のようなことも簡単にできます。
/* エレメントのclassNameから、'classB'を除く */
var elm = document.createElement('div');
elm.className = 'classA classB classC';
elm.className = elm.className.split(/\s+/).a(function(c) {
for (var i = 0; i < this.length; i++) if (this[i] == c) this.splice(i--, 1);
return this;
}, 'classB').join(' ');
window.alert(elm.className); /* classA classC */
便利だー
トラックバックURL
- http://liosk.blog103.fc2.com/tb.php/45-329f58f5

