underscore-source 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/underscore-source/version.rb +1 -1
- data/vendor/assets/javascripts/underscore.js +107 -98
- metadata +1 -1
@@ -1,24 +1,25 @@
|
|
1
|
-
//
|
2
|
-
//
|
3
|
-
// Underscore
|
4
|
-
//
|
5
|
-
//
|
6
|
-
//
|
7
|
-
// http://documentcloud.github.com/underscore
|
1
|
+
// (c) 2010 Jeremy Ashkenas, DocumentCloud Inc.
|
2
|
+
// Underscore is freely distributable under the terms of the MIT license.
|
3
|
+
// Portions of Underscore are inspired by or borrowed from Prototype.js,
|
4
|
+
// Oliver Steele's Functional, and John Resig's Micro-Templating.
|
5
|
+
// For all details and documentation:
|
6
|
+
// http://documentcloud.github.com/underscore
|
8
7
|
|
9
8
|
(function() {
|
10
|
-
// ------------------------- Baseline setup ---------------------------------
|
11
9
|
|
12
|
-
//
|
10
|
+
// Baseline setup
|
11
|
+
// --------------
|
12
|
+
|
13
|
+
// Establish the root object, `window` in the browser, or `global` on the server.
|
13
14
|
var root = this;
|
14
15
|
|
15
|
-
// Save the previous value of the
|
16
|
+
// Save the previous value of the `_` variable.
|
16
17
|
var previousUnderscore = root._;
|
17
18
|
|
18
19
|
// Establish the object that gets thrown to break out of a loop iteration.
|
19
20
|
var breaker = typeof StopIteration !== 'undefined' ? StopIteration : '__break__';
|
20
21
|
|
21
|
-
// Quick regexp-escaping function, because JS doesn't have RegExp.escape()
|
22
|
+
// Quick regexp-escaping function, because JS doesn't have a `RegExp.escape()`.
|
22
23
|
var escapeRegExp = function(s) { return s.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1'); };
|
23
24
|
|
24
25
|
// Save bytes in the minified (but not gzipped) version:
|
@@ -31,7 +32,8 @@
|
|
31
32
|
hasOwnProperty = ObjProto.hasOwnProperty,
|
32
33
|
propertyIsEnumerable = ObjProto.propertyIsEnumerable;
|
33
34
|
|
34
|
-
// All
|
35
|
+
// All **ECMAScript 5** native function implementations that we hope to use
|
36
|
+
// are declared here.
|
35
37
|
var
|
36
38
|
nativeForEach = ArrayProto.forEach,
|
37
39
|
nativeMap = ArrayProto.map,
|
@@ -48,20 +50,21 @@
|
|
48
50
|
// Create a safe reference to the Underscore object for use below.
|
49
51
|
var _ = function(obj) { return new wrapper(obj); };
|
50
52
|
|
51
|
-
// Export the Underscore object for CommonJS
|
53
|
+
// Export the Underscore object for **CommonJS**.
|
52
54
|
if (typeof exports !== 'undefined') exports._ = _;
|
53
55
|
|
54
|
-
// Export
|
56
|
+
// Export Underscore to the global scope.
|
55
57
|
root._ = _;
|
56
58
|
|
57
59
|
// Current version.
|
58
|
-
_.VERSION = '1.1.
|
60
|
+
_.VERSION = '1.1.1';
|
59
61
|
|
60
|
-
//
|
62
|
+
// Collection Functions
|
63
|
+
// --------------------
|
61
64
|
|
62
|
-
// The cornerstone, an each implementation.
|
63
|
-
// Handles objects implementing forEach
|
64
|
-
// Delegates to
|
65
|
+
// The cornerstone, an `each` implementation.
|
66
|
+
// Handles objects implementing `forEach`, arrays, and raw objects.
|
67
|
+
// Delegates to **ECMAScript 5**'s native `forEach` if available.
|
65
68
|
var each = _.forEach = function(obj, iterator, context) {
|
66
69
|
try {
|
67
70
|
if (nativeForEach && obj.forEach === nativeForEach) {
|
@@ -80,18 +83,18 @@
|
|
80
83
|
};
|
81
84
|
|
82
85
|
// Return the results of applying the iterator to each element.
|
83
|
-
// Delegates to
|
86
|
+
// Delegates to **ECMAScript 5**'s native `map` if available.
|
84
87
|
_.map = function(obj, iterator, context) {
|
85
88
|
if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
|
86
89
|
var results = [];
|
87
90
|
each(obj, function(value, index, list) {
|
88
|
-
results.
|
91
|
+
results[results.length] = iterator.call(context, value, index, list);
|
89
92
|
});
|
90
93
|
return results;
|
91
94
|
};
|
92
95
|
|
93
|
-
// Reduce builds up a single result from a list of values, aka inject
|
94
|
-
// Delegates to
|
96
|
+
// **Reduce** builds up a single result from a list of values, aka `inject`,
|
97
|
+
// or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
|
95
98
|
_.reduce = function(obj, iterator, memo, context) {
|
96
99
|
if (nativeReduce && obj.reduce === nativeReduce) {
|
97
100
|
if (context) iterator = _.bind(iterator, context);
|
@@ -103,8 +106,8 @@
|
|
103
106
|
return memo;
|
104
107
|
};
|
105
108
|
|
106
|
-
// The right-associative version of reduce, also known as foldr
|
107
|
-
// Delegates to
|
109
|
+
// The right-associative version of reduce, also known as `foldr`. Uses
|
110
|
+
// Delegates to **ECMAScript 5**'s native reduceRight if available.
|
108
111
|
_.reduceRight = function(obj, iterator, memo, context) {
|
109
112
|
if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
|
110
113
|
if (context) iterator = _.bind(iterator, context);
|
@@ -127,12 +130,12 @@
|
|
127
130
|
};
|
128
131
|
|
129
132
|
// Return all the elements that pass a truth test.
|
130
|
-
// Delegates to
|
133
|
+
// Delegates to **ECMAScript 5**'s native `filter` if available.
|
131
134
|
_.filter = function(obj, iterator, context) {
|
132
135
|
if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
|
133
136
|
var results = [];
|
134
137
|
each(obj, function(value, index, list) {
|
135
|
-
iterator.call(context, value, index, list)
|
138
|
+
if (iterator.call(context, value, index, list)) results[results.length] = value;
|
136
139
|
});
|
137
140
|
return results;
|
138
141
|
};
|
@@ -141,13 +144,13 @@
|
|
141
144
|
_.reject = function(obj, iterator, context) {
|
142
145
|
var results = [];
|
143
146
|
each(obj, function(value, index, list) {
|
144
|
-
!iterator.call(context, value, index, list)
|
147
|
+
if (!iterator.call(context, value, index, list)) results[results.length] = value;
|
145
148
|
});
|
146
149
|
return results;
|
147
150
|
};
|
148
151
|
|
149
152
|
// Determine whether all of the elements match a truth test.
|
150
|
-
// Delegates to
|
153
|
+
// Delegates to **ECMAScript 5**'s native `every` if available.
|
151
154
|
_.every = function(obj, iterator, context) {
|
152
155
|
iterator = iterator || _.identity;
|
153
156
|
if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
|
@@ -159,7 +162,7 @@
|
|
159
162
|
};
|
160
163
|
|
161
164
|
// Determine if at least one element in the object matches a truth test.
|
162
|
-
// Delegates to
|
165
|
+
// Delegates to **ECMAScript 5**'s native `some` if available.
|
163
166
|
_.some = function(obj, iterator, context) {
|
164
167
|
iterator = iterator || _.identity;
|
165
168
|
if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
|
@@ -170,7 +173,7 @@
|
|
170
173
|
return result;
|
171
174
|
};
|
172
175
|
|
173
|
-
// Determine if a given value is included in the array or object using
|
176
|
+
// Determine if a given value is included in the array or object using `===`.
|
174
177
|
_.include = function(obj, target) {
|
175
178
|
if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
|
176
179
|
var found = false;
|
@@ -180,20 +183,20 @@
|
|
180
183
|
return found;
|
181
184
|
};
|
182
185
|
|
183
|
-
// Invoke a method with arguments on every item in a collection.
|
186
|
+
// Invoke a method (with arguments) on every item in a collection.
|
184
187
|
_.invoke = function(obj, method) {
|
185
|
-
var args =
|
188
|
+
var args = slice.call(arguments, 2);
|
186
189
|
return _.map(obj, function(value) {
|
187
190
|
return (method ? value[method] : value).apply(value, args);
|
188
191
|
});
|
189
192
|
};
|
190
193
|
|
191
|
-
// Convenience version of a common use case of map
|
194
|
+
// Convenience version of a common use case of `map`: fetching a property.
|
192
195
|
_.pluck = function(obj, key) {
|
193
196
|
return _.map(obj, function(value){ return value[key]; });
|
194
197
|
};
|
195
198
|
|
196
|
-
// Return the maximum
|
199
|
+
// Return the maximum element or (element-based computation).
|
197
200
|
_.max = function(obj, iterator, context) {
|
198
201
|
if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);
|
199
202
|
var result = {computed : -Infinity};
|
@@ -240,7 +243,7 @@
|
|
240
243
|
return low;
|
241
244
|
};
|
242
245
|
|
243
|
-
//
|
246
|
+
// Safely convert anything iterable into a real, live array.
|
244
247
|
_.toArray = function(iterable) {
|
245
248
|
if (!iterable) return [];
|
246
249
|
if (iterable.toArray) return iterable.toArray();
|
@@ -254,19 +257,20 @@
|
|
254
257
|
return _.toArray(obj).length;
|
255
258
|
};
|
256
259
|
|
257
|
-
//
|
260
|
+
// Array Functions
|
261
|
+
// ---------------
|
258
262
|
|
259
|
-
// Get the first element of an array. Passing
|
260
|
-
// values in the array. Aliased as
|
261
|
-
// with _.map
|
263
|
+
// Get the first element of an array. Passing **n** will return the first N
|
264
|
+
// values in the array. Aliased as `head`. The **guard** check allows it to work
|
265
|
+
// with `_.map`.
|
262
266
|
_.first = function(array, n, guard) {
|
263
267
|
return n && !guard ? slice.call(array, 0, n) : array[0];
|
264
268
|
};
|
265
269
|
|
266
|
-
// Returns everything but the first entry of the array. Aliased as
|
267
|
-
// Especially useful on the arguments object. Passing an
|
268
|
-
// the rest of the values in the array from that index onward. The
|
269
|
-
|
270
|
+
// Returns everything but the first entry of the array. Aliased as `tail`.
|
271
|
+
// Especially useful on the arguments object. Passing an **index** will return
|
272
|
+
// the rest of the values in the array from that index onward. The **guard**
|
273
|
+
// check allows it to work with `_.map`.
|
270
274
|
_.rest = function(array, index, guard) {
|
271
275
|
return slice.call(array, _.isUndefined(index) || guard ? 1 : index);
|
272
276
|
};
|
@@ -285,14 +289,14 @@
|
|
285
289
|
_.flatten = function(array) {
|
286
290
|
return _.reduce(array, function(memo, value) {
|
287
291
|
if (_.isArray(value)) return memo.concat(_.flatten(value));
|
288
|
-
memo.
|
292
|
+
memo[memo.length] = value;
|
289
293
|
return memo;
|
290
294
|
}, []);
|
291
295
|
};
|
292
296
|
|
293
297
|
// Return a version of the array that does not contain the specified value(s).
|
294
298
|
_.without = function(array) {
|
295
|
-
var values =
|
299
|
+
var values = slice.call(arguments, 1);
|
296
300
|
return _.filter(array, function(value){ return !_.include(values, value); });
|
297
301
|
};
|
298
302
|
|
@@ -300,7 +304,7 @@
|
|
300
304
|
// been sorted, you have the option of using a faster algorithm.
|
301
305
|
_.uniq = function(array, isSorted) {
|
302
306
|
return _.reduce(array, function(memo, el, i) {
|
303
|
-
if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) memo.
|
307
|
+
if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) memo[memo.length] = el;
|
304
308
|
return memo;
|
305
309
|
}, []);
|
306
310
|
};
|
@@ -308,7 +312,7 @@
|
|
308
312
|
// Produce an array that contains every item shared between all the
|
309
313
|
// passed-in arrays.
|
310
314
|
_.intersect = function(array) {
|
311
|
-
var rest =
|
315
|
+
var rest = slice.call(arguments, 1);
|
312
316
|
return _.filter(_.uniq(array), function(item) {
|
313
317
|
return _.every(rest, function(other) {
|
314
318
|
return _.indexOf(other, item) >= 0;
|
@@ -319,17 +323,17 @@
|
|
319
323
|
// Zip together multiple lists into a single array -- elements that share
|
320
324
|
// an index go together.
|
321
325
|
_.zip = function() {
|
322
|
-
var args =
|
326
|
+
var args = slice.call(arguments);
|
323
327
|
var length = _.max(_.pluck(args, 'length'));
|
324
328
|
var results = new Array(length);
|
325
|
-
for (var i = 0; i < length; i++) results[i] = _.pluck(args,
|
329
|
+
for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
|
326
330
|
return results;
|
327
331
|
};
|
328
332
|
|
329
333
|
// If the browser doesn't supply us with indexOf (I'm looking at you, MSIE),
|
330
334
|
// we need this function. Return the position of the first occurence of an
|
331
335
|
// item in an array, or -1 if the item is not included in the array.
|
332
|
-
// Delegates to
|
336
|
+
// Delegates to **ECMAScript 5**'s native `indexOf` if available.
|
333
337
|
_.indexOf = function(array, item) {
|
334
338
|
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
|
335
339
|
for (var i = 0, l = array.length; i < l; i++) if (array[i] === item) return i;
|
@@ -337,7 +341,7 @@
|
|
337
341
|
};
|
338
342
|
|
339
343
|
|
340
|
-
// Delegates to
|
344
|
+
// Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
|
341
345
|
_.lastIndexOf = function(array, item) {
|
342
346
|
if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
|
343
347
|
var i = array.length;
|
@@ -346,10 +350,10 @@
|
|
346
350
|
};
|
347
351
|
|
348
352
|
// Generate an integer Array containing an arithmetic progression. A port of
|
349
|
-
// the native Python range() function. See
|
350
|
-
// http://docs.python.org/library/functions.html#range
|
353
|
+
// the native Python `range()` function. See
|
354
|
+
// [the Python documentation](http://docs.python.org/library/functions.html#range).
|
351
355
|
_.range = function(start, stop, step) {
|
352
|
-
var a =
|
356
|
+
var a = slice.call(arguments);
|
353
357
|
var solo = a.length <= 1;
|
354
358
|
var start = solo ? 0 : a[0], stop = solo ? a[0] : a[1], step = a[2] || 1;
|
355
359
|
var len = Math.ceil((stop - start) / step);
|
@@ -361,21 +365,22 @@
|
|
361
365
|
}
|
362
366
|
};
|
363
367
|
|
364
|
-
//
|
368
|
+
// Function Functions
|
369
|
+
// ------------------
|
365
370
|
|
366
|
-
// Create a function bound to a given object (assigning
|
367
|
-
// optionally). Binding with arguments is also known as
|
371
|
+
// Create a function bound to a given object (assigning `this`, and arguments,
|
372
|
+
// optionally). Binding with arguments is also known as `curry`.
|
368
373
|
_.bind = function(func, obj) {
|
369
|
-
var args =
|
374
|
+
var args = slice.call(arguments, 2);
|
370
375
|
return function() {
|
371
|
-
return func.apply(obj || {}, args.concat(
|
376
|
+
return func.apply(obj || {}, args.concat(slice.call(arguments)));
|
372
377
|
};
|
373
378
|
};
|
374
379
|
|
375
380
|
// Bind all of an object's methods to that object. Useful for ensuring that
|
376
381
|
// all callbacks defined on an object belong to it.
|
377
382
|
_.bindAll = function(obj) {
|
378
|
-
var funcs =
|
383
|
+
var funcs = slice.call(arguments, 1);
|
379
384
|
if (funcs.length == 0) funcs = _.functions(obj);
|
380
385
|
each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
|
381
386
|
return obj;
|
@@ -394,14 +399,14 @@
|
|
394
399
|
// Delays a function for the given number of milliseconds, and then calls
|
395
400
|
// it with the arguments supplied.
|
396
401
|
_.delay = function(func, wait) {
|
397
|
-
var args =
|
402
|
+
var args = slice.call(arguments, 2);
|
398
403
|
return setTimeout(function(){ return func.apply(func, args); }, wait);
|
399
404
|
};
|
400
405
|
|
401
406
|
// Defers a function, scheduling it to run after the current call stack has
|
402
407
|
// cleared.
|
403
408
|
_.defer = function(func) {
|
404
|
-
return _.delay.apply(_, [func, 1].concat(
|
409
|
+
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
|
405
410
|
};
|
406
411
|
|
407
412
|
// Returns the first function passed as an argument to the second,
|
@@ -409,7 +414,7 @@
|
|
409
414
|
// conditionally execute the original function.
|
410
415
|
_.wrap = function(func, wrapper) {
|
411
416
|
return function() {
|
412
|
-
var args = [func].concat(
|
417
|
+
var args = [func].concat(slice.call(arguments));
|
413
418
|
return wrapper.apply(wrapper, args);
|
414
419
|
};
|
415
420
|
};
|
@@ -417,9 +422,9 @@
|
|
417
422
|
// Returns a function that is the composition of a list of functions, each
|
418
423
|
// consuming the return value of the function that follows.
|
419
424
|
_.compose = function() {
|
420
|
-
var funcs =
|
425
|
+
var funcs = slice.call(arguments);
|
421
426
|
return function() {
|
422
|
-
var args =
|
427
|
+
var args = slice.call(arguments);
|
423
428
|
for (var i=funcs.length-1; i >= 0; i--) {
|
424
429
|
args = [funcs[i].apply(this, args)];
|
425
430
|
}
|
@@ -427,14 +432,15 @@
|
|
427
432
|
};
|
428
433
|
};
|
429
434
|
|
430
|
-
//
|
435
|
+
// Object Functions
|
436
|
+
// ----------------
|
431
437
|
|
432
438
|
// Retrieve the names of an object's properties.
|
433
|
-
// Delegates to
|
439
|
+
// Delegates to **ECMAScript 5**'s native `Object.keys`
|
434
440
|
_.keys = nativeKeys || function(obj) {
|
435
441
|
if (_.isArray(obj)) return _.range(0, obj.length);
|
436
442
|
var keys = [];
|
437
|
-
for (var key in obj) if (hasOwnProperty.call(obj, key)) keys.
|
443
|
+
for (var key in obj) if (hasOwnProperty.call(obj, key)) keys[keys.length] = key;
|
438
444
|
return keys;
|
439
445
|
};
|
440
446
|
|
@@ -450,7 +456,7 @@
|
|
450
456
|
|
451
457
|
// Extend a given object with all the properties in passed-in object(s).
|
452
458
|
_.extend = function(obj) {
|
453
|
-
each(
|
459
|
+
each(slice.call(arguments, 1), function(source) {
|
454
460
|
for (var prop in source) obj[prop] = source[prop];
|
455
461
|
});
|
456
462
|
return obj;
|
@@ -463,7 +469,8 @@
|
|
463
469
|
};
|
464
470
|
|
465
471
|
// Invokes interceptor with the obj, and then returns obj.
|
466
|
-
// The primary purpose of this method is to "tap into" a method chain, in
|
472
|
+
// The primary purpose of this method is to "tap into" a method chain, in
|
473
|
+
// order to perform operations on intermediate results within the chain.
|
467
474
|
_.tap = function(obj, interceptor) {
|
468
475
|
interceptor(obj);
|
469
476
|
return obj;
|
@@ -525,7 +532,7 @@
|
|
525
532
|
|
526
533
|
// Is a given variable an arguments object?
|
527
534
|
_.isArguments = function(obj) {
|
528
|
-
return obj && obj.callee;
|
535
|
+
return !!(obj && obj.callee);
|
529
536
|
};
|
530
537
|
|
531
538
|
// Is a given value a function?
|
@@ -574,9 +581,10 @@
|
|
574
581
|
return typeof obj == 'undefined';
|
575
582
|
};
|
576
583
|
|
577
|
-
//
|
584
|
+
// Utility Functions
|
585
|
+
// -----------------
|
578
586
|
|
579
|
-
// Run Underscore.js in noConflict mode, returning the
|
587
|
+
// Run Underscore.js in *noConflict* mode, returning the `_` variable to its
|
580
588
|
// previous owner. Returns a reference to the Underscore object.
|
581
589
|
_.noConflict = function() {
|
582
590
|
root._ = previousUnderscore;
|
@@ -588,7 +596,7 @@
|
|
588
596
|
return value;
|
589
597
|
};
|
590
598
|
|
591
|
-
// Run a function n times.
|
599
|
+
// Run a function **n** times.
|
592
600
|
_.times = function (n, iterator, context) {
|
593
601
|
for (var i = 0; i < n; i++) iterator.call(context, i);
|
594
602
|
};
|
@@ -617,35 +625,35 @@
|
|
617
625
|
// By default, Underscore uses ERB-style template delimiters, change the
|
618
626
|
// following template settings to use alternative delimiters.
|
619
627
|
_.templateSettings = {
|
620
|
-
|
621
|
-
|
622
|
-
interpolate : /<%=(.+?)%>/g
|
628
|
+
evaluate : /<%([\s\S]+?)%>/g,
|
629
|
+
interpolate : /<%=([\s\S]+?)%>/g
|
623
630
|
};
|
624
631
|
|
625
|
-
// JavaScript templating
|
626
|
-
//
|
627
|
-
//
|
628
|
-
// With alterations for arbitrary delimiters, and to preserve whitespace.
|
632
|
+
// JavaScript micro-templating, similar to John Resig's implementation.
|
633
|
+
// Underscore templating handles arbitrary delimiters, preserves whitespace,
|
634
|
+
// and correctly escapes quotes within interpolated code.
|
629
635
|
_.template = function(str, data) {
|
630
636
|
var c = _.templateSettings;
|
631
|
-
var
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
637
|
+
var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
|
638
|
+
'with(obj||{}){__p.push(\'' +
|
639
|
+
str.replace(/'/g, "\\'")
|
640
|
+
.replace(c.interpolate, function(match, code) {
|
641
|
+
return "'," + code.replace(/\\'/g, "'") + ",'";
|
642
|
+
})
|
643
|
+
.replace(c.evaluate || null, function(match, code) {
|
644
|
+
return "');" + code.replace(/\\'/g, "'")
|
645
|
+
.replace(/[\r\n\t]/g, ' ') + "__p.push('";
|
646
|
+
})
|
647
|
+
.replace(/\r/g, '\\r')
|
636
648
|
.replace(/\n/g, '\\n')
|
637
649
|
.replace(/\t/g, '\\t')
|
638
|
-
.
|
639
|
-
|
640
|
-
|
641
|
-
.replace(c.interpolate, "',$1,'")
|
642
|
-
.split(c.start).join("');")
|
643
|
-
.split(c.end).join("p.push('")
|
644
|
-
+ "');}return p.join('');");
|
645
|
-
return data ? fn(data) : fn;
|
650
|
+
+ "');}return __p.join('');";
|
651
|
+
var func = new Function('obj', tmpl);
|
652
|
+
return data ? func(data) : func;
|
646
653
|
};
|
647
654
|
|
648
|
-
//
|
655
|
+
// Aliases:
|
656
|
+
// --------
|
649
657
|
|
650
658
|
_.each = _.forEach;
|
651
659
|
_.foldl = _.inject = _.reduce;
|
@@ -658,7 +666,8 @@
|
|
658
666
|
_.tail = _.rest;
|
659
667
|
_.methods = _.functions;
|
660
668
|
|
661
|
-
//
|
669
|
+
// The OOP Wrapper
|
670
|
+
// ---------------
|
662
671
|
|
663
672
|
// If Underscore is called as a function, it returns a wrapped object that
|
664
673
|
// can be used OO-style. This wrapper holds altered versions of all the
|
@@ -673,7 +682,7 @@
|
|
673
682
|
// A method to easily add functions to the OOP wrapper.
|
674
683
|
var addToWrapper = function(name, func) {
|
675
684
|
wrapper.prototype[name] = function() {
|
676
|
-
var args =
|
685
|
+
var args = slice.call(arguments);
|
677
686
|
unshift.call(args, this._wrapped);
|
678
687
|
return result(func.apply(_, args), this._chain);
|
679
688
|
};
|