ソースの意図の探り方
第三回目です。
オープンソースの成果物を利用する際に,
幸いなことに,
Prototypeライブラリは現在ではRuby on RailsのSubversionリポジトリ上で管理されており,
ライブラリを利用する際には単一のprototype.
そこで,
では,
$A()関数
0640: var $A = Array.from = function(iterable) {
0641: if (!iterable) return [];
0642: if (iterable.toArray) {
0643: return iterable.toArray();
0644: } else {
0645: var results = [];
0646: for (var i = 0, length = iterable.length; i < length; i++)
0647: results.push(iterable[i]);
0648: return results;
0649: }
0650: }
0651:
640行目からは$A()関数です。同時にArray.
641行目では,
次に,
それ以外の場合,
0652: if (Prototype.Browser.WebKit) {
0653: $A = Array.from = function(iterable) {
0654: if (!iterable) return [];
0655: if (!(typeof iterable == 'function' && iterable == '[object NodeList]') &&
0656: iterable.toArray) {
0657: return iterable.toArray();
0658: } else {
0659: var results = [];
0660: for (var i = 0, length = iterable.length; i < length; i++)
0661: results.push(iterable[i]);
0662: return results;
0663: }
0664: }
0665: }
0666:
652行目からは,
中身はほぼ同じですが,
Array オブジェクトへの拡張
0667: Object.extend(Array.prototype, Enumerable);
0668:
Arrayの拡張をするのに,
0669: if (!Array.prototype._reverse)
0670: Array.prototype._reverse = Array.prototype.reverse;
0671:
後でArray.
0672: Object.extend(Array.prototype, {
0673: _each: function(iterator) {
0674: for (var i = 0, length = this.length; i < length; i++)
0675: iterator(this[i]);
0676: },
0677:
mixinしたEnumerable.
0678: clear: function() {
0679: this.length = 0;
0680: return this;
0681: },
0682:
678行目からはclear()メソッドです。配列の場合はlengthプロパティに0をセットするだけで要素をクリアできるので,
0683: first: function() {
0684: return this[0];
0685: },
0686:
0687: last: function() {
0688: return this[this.length - 1];
0689: },
0690:
683行目からはfirst()メソッドです。配列では単にthis[0]と先頭の要素を返しています。
687行目からのlast()メソッドも簡単で,
0691: compact: function() {
0692: return this.select(function(value) {
0693: return value != null;
0694: });
0695: },
0696:
691行目からはcompact()メソッドです。nullかundefinedな要素を取り除いた配列を返します。
undefinedを!=でnullと比較すると真になるため
0697: flatten: function() {
0698: return this.inject([], function(array, value) {
0699: return array.concat(value && value.constructor == Array ?
0700: value.flatten() : [value]);
0701: });
0702: },
0703:
697行目からはflatten()メソッドです。多層構造の配列をフラットな一次元配列に変換します。階層構造に対応するために,
689行目で,
new式で生成されたオブジェクトは,