bbo
Version:
bbo is a utility library of zero dependencies for javascript.
57 lines (43 loc) • 1.24 kB
JavaScript
;
var is_object = require('./is_object.js');
require('./get_tag.js');
var is_array = require('./is_array.js');
var is_function = require('./is_function.js');
var is_boolean = require('./is_boolean.js');
function extend()
/* [deep], obj1, obj2, [objn] */
{
var args = [].slice.call(arguments);
var deep = false;
if (is_boolean(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 = is_array(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 is_array(obj) || is_object(obj);
}
function isUnextendable(val) {
return !val || !is_object(val) && !is_function(val);
}
module.exports = extend;