You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					75 lines
				
				2.2 KiB
			
		
		
			
		
	
	
					75 lines
				
				2.2 KiB
			| 
											3 years ago
										 | var arrayEach = require('./_arrayEach'), | ||
|  |     arrayPush = require('./_arrayPush'), | ||
|  |     baseFunctions = require('./_baseFunctions'), | ||
|  |     copyArray = require('./_copyArray'), | ||
|  |     isFunction = require('./isFunction'), | ||
|  |     isObject = require('./isObject'), | ||
|  |     keys = require('./keys'); | ||
|  | 
 | ||
|  | /** | ||
|  |  * Adds all own enumerable string keyed function properties of a source | ||
|  |  * object to the destination object. If `object` is a function, then methods | ||
|  |  * are added to its prototype as well. | ||
|  |  * | ||
|  |  * **Note:** Use `_.runInContext` to create a pristine `lodash` function to | ||
|  |  * avoid conflicts caused by modifying the original. | ||
|  |  * | ||
|  |  * @static | ||
|  |  * @since 0.1.0 | ||
|  |  * @memberOf _ | ||
|  |  * @category Util | ||
|  |  * @param {Function|Object} [object=lodash] The destination object. | ||
|  |  * @param {Object} source The object of functions to add. | ||
|  |  * @param {Object} [options={}] The options object. | ||
|  |  * @param {boolean} [options.chain=true] Specify whether mixins are chainable. | ||
|  |  * @returns {Function|Object} Returns `object`. | ||
|  |  * @example | ||
|  |  * | ||
|  |  * function vowels(string) { | ||
|  |  *   return _.filter(string, function(v) { | ||
|  |  *     return /[aeiou]/i.test(v); | ||
|  |  *   }); | ||
|  |  * } | ||
|  |  * | ||
|  |  * _.mixin({ 'vowels': vowels }); | ||
|  |  * _.vowels('fred'); | ||
|  |  * // => ['e']
 | ||
|  |  * | ||
|  |  * _('fred').vowels().value(); | ||
|  |  * // => ['e']
 | ||
|  |  * | ||
|  |  * _.mixin({ 'vowels': vowels }, { 'chain': false }); | ||
|  |  * _('fred').vowels(); | ||
|  |  * // => ['e']
 | ||
|  |  */ | ||
|  | function mixin(object, source, options) { | ||
|  |   var props = keys(source), | ||
|  |       methodNames = baseFunctions(source, props); | ||
|  | 
 | ||
|  |   var chain = !(isObject(options) && 'chain' in options) || !!options.chain, | ||
|  |       isFunc = isFunction(object); | ||
|  | 
 | ||
|  |   arrayEach(methodNames, function(methodName) { | ||
|  |     var func = source[methodName]; | ||
|  |     object[methodName] = func; | ||
|  |     if (isFunc) { | ||
|  |       object.prototype[methodName] = function() { | ||
|  |         var chainAll = this.__chain__; | ||
|  |         if (chain || chainAll) { | ||
|  |           var result = object(this.__wrapped__), | ||
|  |               actions = result.__actions__ = copyArray(this.__actions__); | ||
|  | 
 | ||
|  |           actions.push({ 'func': func, 'args': arguments, 'thisArg': object }); | ||
|  |           result.__chain__ = chainAll; | ||
|  |           return result; | ||
|  |         } | ||
|  |         return func.apply(object, arrayPush([this.value()], arguments)); | ||
|  |       }; | ||
|  |     } | ||
|  |   }); | ||
|  | 
 | ||
|  |   return object; | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = mixin; |