Created
December 2, 2015 11:58
-
-
Save mitsuru793/995276927aef56107083 to your computer and use it in GitHub Desktop.
Underscore.jsのラップとは、何が便利なのかをコードリーディングで確かめる。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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