Aller au contenu

Initialiser l’objet paresseux

Logo de personne folle

Le code principal de Firefox DevTools, qui est écrit en JavaScript et HTML, est une application complexe. Compte tenu de la complexité et de la quantité de travail à effectuer, l’équipe DevTools a tout mis en œuvre pour charger le moins possible. De plus, l’équipe dispose d’un système pour importer des objets et les initialiser paresseusement quand ils sont nécessaires. J’ai pris du temps pour réduire l’initialiseur, jetons un coup d’œil !

Le système est basé sur l’exploitation de Object.definePropertyc’est get Fonction pour initialiser un objet en cas de besoin :

// Lazily initializes an object's property until it's used
function lazyGet(hostObj, name, initializer) {
    let defined = false;
    Object.defineProperty(hostObj, name, {
        get: function () {
            // If not already defined, define it by executing
            // its initializer and setting it as value
            if (!defined) {
                defined = true;
                // Overrides the original property definition
                // which is the initializer
                Object.defineProperty(hostObj, name, {
                    configurable: true,
                    enumerable: true,
                    value: initializer.apply(hostObj),
                    writable: true,
                });
                return hostObj[name];
            }
        },
        configurable: true,
        enumerable: true
    });
}

avec le lazyGet fonction, la propriété que vous voulez n’est initialisée et manipulée que lorsque son getter est appelé :

// Don't define window.myProp until someone tries to use it
// Thus, if it's never used, it's never initialized
lazyGet(window, "myProp", () => {
    return { message: "Hello!" };
});

// window.myProp is now undefined, since it hasn't been requested yet

// Use it for something, which triggers initialization and returns its value
console.log(window.myProp.message);

// Using it again doesn't initialize again, since it was already created
console.log(window.myProp.message);

// And it can be reassigned later on:
window.myProp = null;

Le configurateur de Mozilla est un peu plus compliqué car il agit également comme un chargeur, mais vous voyez l’idée. Nous pensons toujours aux ressources de chargement paresseux, mais c’est aussi une bonne idée de penser à l’initialisation des propriétés car elles peuvent ne pas être nécessaires ! Gardez une petite empreinte si vous le pouvez !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *