Inicializace líného objektu

Základní kód Firefox DevTools, který je napsán pomocí JavaScriptu a HTML, je komplexní aplikace. Vzhledem ke složitosti a množství probíhající práce udělal tým DevTools vše pro to, aby se načítal co nejméně. Kromě toho má tým systém líného importu a inicializace objektů, když jsou potřeba. Dal jsem si trochu času na zmenšení inicializátoru, pojďme se na to podívat!

Systém se spoléhá na využití výhod Object.defineProperty 's get funkce pro inicializaci objektu v případě potřeby:

// 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
    });
}

S lazyGet Funkce, kterou chcete, je inicializována a zpracovávána pouze tehdy, když je zavolán její getter:

// 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;

Inicializátor Mozilly je mnohem složitější, protože funguje také jako zavaděč, ale máte představu. Vždy přemýšlíme o líném načítání zdrojů, ale je také dobré myslet na inicializaci vlastností, protože nemusí být potřeba! Pokud můžete, zachovejte malou stopu!