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.

Reply via email to