The heart of MooTools.
(function(){
var arrayish = Array.prototype.indexOf;
var stringish = String.prototype.indexOf
Speedup 1: Avoid typeOf
var cloneOf = function(item){
if (item && typeof(item) == 'object' && item.indexOf != stringish && !(item.nodeName && item.nodeType)) {
if (item.indexOf == arrayish) return item.clone();
else return Object.clone(item);
}
return item;
};
Array.implement('clone', function(){
var i = this.length, clone = new Array(i);
while (i--) clone[i] = cloneOf(this[i]);
return clone;
});
Speedup 2: Avoid typeOf
var mergeOne = function(source, key, current){
if (current && typeof(current) == 'object' && current.indexOf != stringish && !(current.nodeName && current.nodeType)) {
if (current.indexOf != arrayish) {
var target = source[key];
if (target && typeof(target) == 'object' && current.indexOf != stringish && target.indexOf != arrayish) Object.merge(source[key], current);
else source[key] = Object.clone(current);
} else source[key] = current.clone();
} else source[key] = current;
return source;
};
Object.extend({
Speedup 3: Avoid typeOf
merge: function(source, k, v){
if (typeof(k) == 'string' || (k && k.indexOf == stringish)) return mergeOne(source, k, v);
for (var i = 1, l = arguments.length; i < l; i++){
var object = arguments[i];
for (var key in object) mergeOne(source, key, object[key]);
}
return source;
},
clone: function(object){
var clone = {};
for (var key in object) clone[key] = cloneOf(object[key]);
return clone;
}
});
})();