From bb49b0c16a73dd85362196d3bd7640584400d962 Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Thu, 18 Jul 2013 08:12:14 -0700 Subject: [PATCH] Allow `_.mixin` to accept a destination object as well as a source object. Former-commit-id: 11ccb77653f017270c07579f59d75b847d4e6c65 --- build.js | 5 ++++- lodash.js | 33 ++++++++++++++++++++------------- test/test.js | 18 ++++++++++++++++++ 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/build.js b/build.js index 1ca732523..56b0f633d 100644 --- a/build.js +++ b/build.js @@ -153,7 +153,7 @@ 'memoize': [], 'merge': ['createCallback', 'forEach', 'forOwn', 'getArray', 'isArray', 'isObject', 'isPlainObject', 'releaseArray'], 'min': ['basicEach', 'charAtCallback', 'createCallback', 'isArray', 'isString'], - 'mixin': ['forEach', 'functions'], + 'mixin': ['forEach', 'functions', 'isFunction'], 'noConflict': [], 'omit': ['basicFlatten', 'createCallback', 'forIn', 'getIndexOf'], 'once': [], @@ -2716,6 +2716,9 @@ } }); } + if (_.contains(plusFuncs, 'chain') == !isUnderscore) { + funcDependencyMap.mixin = _.without(funcDependencyMap.mixin, 'isFunction'); + } if (isUnderscore) { if (!isLodash('clone') && !isLodash('cloneDeep')) { funcDependencyMap.clone = _.without(funcDependencyMap.clone, 'forEach', 'forOwn'); diff --git a/lodash.js b/lodash.js index 90d96a6cc..aa34d0ab1 100644 --- a/lodash.js +++ b/lodash.js @@ -485,6 +485,7 @@ /** Native method shortcuts */ var ceil = Math.ceil, clearTimeout = context.clearTimeout, + defineProperty = reNative.test(defineProperty = Object.defineProperty) && defineProperty, floor = Math.floor, fnToString = Function.prototype.toString, getPrototypeOf = reNative.test(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf, @@ -5223,20 +5224,26 @@ * _('moe').capitalize(); * // => 'Moe' */ - function mixin(object) { - forEach(functions(object), function(methodName) { - var func = lodash[methodName] = object[methodName]; + function mixin(object, source) { + if (!source) { + source = object; + object = lodash; + } + var isFunc = isFunction(object); + forEach(functions(source), function(methodName) { + var func = object[methodName] = source[methodName]; + if (isFunc) { + object.prototype[methodName] = function() { + var value = this.__wrapped__, + args = [value]; - lodash.prototype[methodName] = function() { - var value = this.__wrapped__, - args = [value]; - - push.apply(args, arguments); - var result = func.apply(lodash, args); - return (value && typeof value == 'object' && value === result) - ? this - : new lodashWrapper(result); - }; + push.apply(args, arguments); + var result = func.apply(object, args); + return (value && typeof value == 'object' && value === result) + ? this + : new lodashWrapper(result); + }; + } }); } diff --git a/test/test.js b/test/test.js index 4a516c815..c03a763b3 100644 --- a/test/test.js +++ b/test/test.js @@ -2234,6 +2234,24 @@ /*--------------------------------------------------------------------------*/ + QUnit.module('lodash.mixin'); + + (function() { + test('should accept an `object` argument', function() { + var lodash = {}; + _.mixin(lodash, { 'a': function(a) { return a[0]; } }); + strictEqual(lodash.a(['a']), 'a'); + }); + + test('should accept a function `object` argument', function() { + var lodash = _.runInContext(); + _.mixin(lodash, { 'a': function(a) { return a[0]; } }); + strictEqual(lodash(['a']).a().value(), 'a'); + }); + }()); + + /*--------------------------------------------------------------------------*/ + QUnit.module('lodash.omit'); (function() {