bbo
Version:
bbo is a utility library of zero dependencies for javascript.
55 lines (42 loc) • 1.2 kB
JavaScript
import isObject from './is_object.js';
import './get_tag.js';
import isArray from './is_array.js';
import isFunction from './is_function.js';
import isBoolean from './is_boolean.js';
function extend()
/* [deep], obj1, obj2, [objn] */
{
var args = [].slice.call(arguments);
var deep = false;
if (isBoolean(args[0])) {
deep = args.shift();
}
var result = args[0];
if (isUnextendable(result)) {
throw new Error('extendee must be an object');
}
var extenders = args.slice(1);
var len = extenders.length;
for (var i = 0; i < len; i++) {
var extender = extenders[i];
for (var key in extender) {
if (extender.hasOwnProperty(key)) {
var value = extender[key];
if (deep && isCloneable(value)) {
var base = isArray(value) ? [] : {};
result[key] = extend(true, result.hasOwnProperty(key) && !isUnextendable(result[key]) ? result[key] : base, value);
} else {
result[key] = value;
}
}
}
}
return result;
}
function isCloneable(obj) {
return isArray(obj) || isObject(obj);
}
function isUnextendable(val) {
return !val || !isObject(val) && !isFunction(val);
}
export default extend;