Allow _.mixin to accept a destination object as well as a source object.

Former-commit-id: 11ccb77653f017270c07579f59d75b847d4e6c65
This commit is contained in:
John-David Dalton
2013-07-18 08:12:14 -07:00
parent 9561414985
commit bb49b0c16a
3 changed files with 42 additions and 14 deletions

View File

@@ -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');

View File

@@ -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);
};
}
});
}

View File

@@ -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() {