Skip to content

Instantly share code, notes, and snippets.

@mitsuru793
Created December 2, 2015 11:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mitsuru793/995276927aef56107083 to your computer and use it in GitHub Desktop.
Save mitsuru793/995276927aef56107083 to your computer and use it in GitHub Desktop.
Underscore.jsのラップとは、何が便利なのかをコードリーディングで確かめる。
// console.logのエイリアス
var l = function(x) { console.log(x) };
// ラップすることによって、自作のオブジェクトからUndersocre.jsのメソッドを使えるようになります。
numbers_array = [5, 2, 1, 5];
_numbers = _([5, 2, 1, 5]);
// ラップしていないオブジェクトを、引数で渡します。
l(_.sortBy(numbers_array)); // [1, 2, 5, 5]
l(numbers_array); // [5, 2, 1, 5]
// 既にオブジェクトをラップしてあるので、第1引数に自動で渡ります。
l(_numbers.sortBy()); // [1, 2, 5, 5]
l(numbers_array); // [5, 2, 1, 5]
// ラップしたオブジェクトで、他のメソッドも使うことが出来ます。
l(_numbers.shuffle()); // [2, 1, 5, 5]
// chainが使えるのも、ラップが関係しています。
first = _numbers.chain()
.shuffle()
.sample()
.value();
l(first); // 5
// ラップしたオブジェクトが自動的に第1引数になることを確かめてみます。
_.mixin({
print_two_args: function(first, second) {
l("frist = " + first);
l("second = " + second);
}
});
_.print_two_args([1,23], "Mike");
// frist = 1,23
// second = Mike
_numbers.print_two_args();
// frist = 5,2,1,5
// second = undefined
_numbers.print_two_args("Jane");
// frist = 5,2,1,5
// second = Jane
// 自動でラップオブジェクトを、第1引数に入れているところを見てみます。
// mixinの挙動をもっと詳しく見たい方は下記を参考
// https://gist.github.com/mitsuru793/855e12e61867c2d855d1
_.mixin = function(obj) {
_.each(_.functions(obj), function(name) {
var func = _[name] = obj[name];
_.prototype[name] = function() {
// ラップしたオブジェクトを配列の要素にします。
var args = [this._wrapped];
// ラップしたオブジェクトの次の要素に、実行するメソッドの引数をpushして繋げます。
// 今回だと、argumentsはprint_two_argsで渡した引数が入っています。
push.apply(args, arguments);
// argsという配列は次のようになりました。
// args = [ラップしたオブジェクト, 実行するメソッドに渡した引数...]
// funcには実行するメソッドが入っています。今回だと、print_two_argsが入っています。
// func.applyは次と同じです。
// _.print_two_args(args)
// _.print_two_args([ラップしたオブジェクト, 実行するメソッドに渡した引数...])
return chainResult(this, func.apply(_, args));
};
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment