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.