Sry for spamming the list, but I just spotted another error (that's what you get when doing quick refactorings for posting stuff in public without testing them properly ^^). Full code again / last post:
$.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; } return obj; } } -- Felix On Aug 5, 7:42 pm, the_undefined <[EMAIL PROTECTED]> wrote: > 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.