There’s a bunch of ways to do this. I think what follows is the most simple, logical, portable and transparent.

Copy:

var copy = function(to, from, deep){
  for(var key in from){
    if(from.hasOwnProperty(key)){
      if(deep && typeof from[key] == 'object'){
        to[key] = arguments.callee.call(null, {}, from[key], deep);
      } else {
        to[key] = from[key];
      }
    }
  }
  return to;
};

Clone:

var clone = function(object){
  return copy({}, object, true);
};

Packaged up:

whatever.namespace.you.want.utils.objects = (function(){
  var methods = {
    copy : function(to, from, deep){
      for(var key in from){
        if(from.hasOwnProperty(key)){
          if(deep && typeof from[key] == 'object'){
            to[key] = arguments.callee.call(null, {}, from[key], deep);
          } else {
            to[key] = from[key];
          }
        }
      }
      return to;
    },
    clone : function(from){
      return methods.copy({}, from, true);
    }
  };
  return methods;
})();