Не нашёл, как называется такой паттерн. Попробую объяснить, как я понимаю этот код.
Во время выполнения кода неизвестно, определён ли уже глобальный объект. У глобального должен быть метод
push()
, принимающий пачку новых параметров. Но мы готовы к обоим вариантам: пушим или в крутой объект, или в пустой массив.
После загрузки внешнего скрипта, тот смотрит, пусто ли глобальное свойство, на которое он претендует. Если не пусто - там накопились данные для него и он их себе записывает куда надо при инициализации. Примерно так:
(function(w, n) {
w[n] = w[n] || [];
w[n].push({a: "A", b: "B"});
})(window, 'tosterQuery');
// в скрипте подгружаемом позже
(function(w, n) {
// не перезаписать объкт. Только если пустой или массив.
if (w[n] && !Array.isArray(w[n])) return;
function f() {
const data = w[n] || [];
// определяем свой push с блекджеком
this.push = function(x) {return data.push(x);}
this.getData = function() {return data;}
}
w[n] = new f(); // занимаем глобальное свойство
})(window, 'tosterQuery');
tosterQuery.getData(); // [{"a":"A","b":"B"}]
tosterQuery.push({z:"Z"});
tosterQuery.getData(); // [{"a":"A","b":"B"}, {"z":"Z"}]