Refine Object.prototype check in _.defaults.

This commit is contained in:
John-David Dalton
2015-12-15 21:04:39 -08:00
parent fb1ed531e4
commit e3c79bd24a
2 changed files with 14 additions and 6 deletions

View File

@@ -2189,12 +2189,15 @@
* @param {*} objValue The destination value.
* @param {*} srcValue The source value.
* @param {string} key The key of the property to assign.
* @param {Object} object The parent object of `objValue`.
* @returns {*} Returns the value to assign.
*/
function assignInDefaults(objValue, srcValue, key) {
return (objValue === undefined || objValue === objectProto[key])
? srcValue
: objValue;
function assignInDefaults(objValue, srcValue, key, object) {
if (objValue === undefined ||
(objValue === objectProto[key] && !hasOwnProperty.call(object, key))) {
return srcValue;
}
return objValue;
}
/**

View File

@@ -3606,10 +3606,15 @@
});
QUnit.test('should assign properties that shadow those on `Object.prototype`', function(assert) {
assert.expect(1);
assert.expect(2);
var ctor = objectProto.constructor,
actual = _.defaults({}, { 'constructor': 1 });
var actual = _.defaults({}, { 'constructor': 1 });
assert.strictEqual(actual.constructor, 1);
actual = _.defaults({ 'constructor': ctor }, { 'constructor': 1 });
assert.strictEqual(actual.constructor, ctor);
});
}());