Ups, that last line should read: return obj;
not 'return clone;'. On Aug 5, 7:30 pm, Felix Geisendörfer <[EMAIL PROTECTED]> wrote: > My function for cloning looks like this: It covers objects, arrays, > functions and jQuery objects / custom objects with an own clone() function: > > ------------------------------------------------------------------------------------------------------------------------------------------------------ > $.extend({ > clone: function(obj, deep) { > // Clone a jQuery object / objects with a custom clone function > if (obj && obj && obj.clone && $.isFunction(obj.clone)) { > return obj.clone(deep); > } > // Clone a function > if ($.isFunction(obj)) { > return function() {return obj.apply(this, arguments);}; > } > > if (obj && obj.constructor == Array) { > // Clone an array > var clone = []; > for(var i = 0; i < obj.length; i++) { > clone[i] = (deep == true) > ? obj[i] > : $.clone(obj[i], deep); > } > return clone; > } else if (obj && obj.constructor == Object) { > // Clone an object > var clone = {}; > for (var p in obj) { > clone[p] = (deep == true) > ? obj[p] > : $.clone(obj[p], deep); > } > } > return clone; > } > ------------------------------------------------------------------------------------------------------------------------------------------------------ > > I'm interested to hear feedback, > -- Felix > -------------------------- > My Blog:http://www.thinkingphp.org > My Business:http://www.fg-webdesign.de > > Erik Beeson wrote: > > Thanks for sharing this. I'm pretty sure what you suggest won't > > properly deal with arrays. Objects aren't the same as arrays. Here's > > how I do something like that: > > > function deepCopy(obj) { > > if(obj && obj.constructor == Object) { > > var newObj = new Object(); > > for(var field in obj) { > > newObj[field] = deepCopy(obj[field]); > > } > > return newObj; > > } else if(obj && obj.constructor == Array) { > > var newArray = new Array(); > > for(var i = 0; i < obj.length; i++) { > > newArray[i] = deepCopy(obj[i]); > > } > > return newArray; > > } > > > return obj; > > } > > > Also, while it's fine to use $ however you want in your own code, for > > code that you're making public, I suggest you checkout the plugin > > authoring guide about not using $ directly: > >http://docs.jquery.com/Plugins/Authoring#Custom_Alias > > > --Erik > > > On 8/5/07, *weepy * <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> > > wrote: > > > During assingment, if the object is not primative, Javascript will > > return a pointer to the object rather than a copy. > > > E.g. > > > a = [1,2] > > b = a > > b[0]=3 > > a ==> [3,2] > > > This clone function makes it possible to copy an object. > > > $.clone = function (obj) { > > if(typeof(obj) != 'object') return obj; > > if(obj == null) return obj; > > var newobj = new Object(); > > for(var i in obj) > > newobj[i] = $.clone(obj[i]); > > return newobj; > > } > > > a = [1,2] > > b = $.clone(a) > > b[0]=3 > > a ==> [1,2] > > > I have found this function invaluable when comparing and complex > > Javascript objects.