Suite à la discussion sur la "deep copy" et la "shallow copy" qu'a introduit zwetan, je me suis attaqué à une ébauche de classe permettant de faire du clonage. Je l'ai testée sur quelques types de bases et quelques classe maisons, et pour l'instant seules les classes MovieClip et Color m'ont posé un problème ... ce qui est logique à priori ! :P

Le principe court-circuite l'instanciation avec new, et se sert des proriétés __proto__ et __constructor__ pour créer le clone :/**
 * Cloner class
 *
 * @version 0.1
 * @author <a href="http://www.lalex.com/">LAlex</a>
 * @since 05/08/2004
 */

class net.lalex.core.Cloner {
        /**
         * Create a clone of an object
         * Works for all datatypes, except MovieClip and Color
         *
         * @param o Object to get a clone
         * @param deep Allow to disable deep copy
         */

        public static function clone(o:Object, deep:Boolean):Object {
                // Set the "deep" param to true by default
                if (deep == undefined) {
                        deep = true;
                }
                // Can't clone MovieClip instances
                if (o instanceof MovieClip || o instanceof Color) {
                        trace("Cloner error : can't clone MovieClip or Color instances !");
                // If object, create a clone and return it
                } else if (typeof o == "object") {
                        // Return objet
                        var ret:Object = {};
                        // Object's constructor
                        var cst:Function = o["__constructor__"];
                        // Assign original prototype to clone
                        ret.__proto__ = o.__proto__;
                        // Objects created with {} have no __constructor__ property
                        if (cst != undefined) {
                                ret["__constructor__"] = cst;
                                cst.apply(ret);
                        }
                        // Copy all properties from the original to the clone
                        // Only "object" properties need to be cloned for deep copy
                        // Also works for arrays ... <img src="http://common.lalex.com/themes/devblog/smilies/icon_cool.gif" alt="8-)" class="smiley" />
                        for (var curProp:String in o) {
                                ret[curProp] = typeof o[curProp] == "object" && deep ? Cloner.clone(o[curProp]) : o[curProp];
                        }
                        return ret;
                }
                // If simple type, returns it
                return o;
        }
}
// Utilisation
import net.lalex.core.Cloner;
var monTableau:Array = [1,2,3,4,5];
// monClone contient un clone de monTableau
var monClone = Cloner.clone(monTableau);
Au début, pour créer la "base" du clone, j'utilisais l'instruction suivante :var ret:Object = new o["__constructor__"]();Cela ne marchait pour les objets créés avec les accolades, étant donné que ces objets ne possèdent pas de propriété __constructor__ comme Timothée Groleau nous le signale dans les commentaires de mon article sur le prototypes ... 8)

Wala, je suis bien évidemment ouvert à tout feedback, que ce soit pour signaler un disfonctionnement sur certaines classes ou types de données, ou pour suggérer une amélioration de cette implémentation du clonage ... ^^