Комментарии 15
Понял, скачиваю и сохраняю софт ДО появления ИИ и записываю на DVD и MO дисках, что бы нельзя было поменять код. Черное настоящие уже наступило
Я, конечно, не Codex, но вы как страдали ерундой 7 лет, так продолжаете. Всё делается куда проще:
export class My_foo extends My_object {
get bar() { return this.$.My_bar } // late singleton binding
}
export let My_bar = 'bar'
export class My_component extends My_object {
@mem get foo() { return new this.$.My_foo } // lazy unique instance
@mem get bar() { return this.$.foo.bar } // memoized deep deps
}Коллега, вы как жили в мире розовых пони (@mem), так там и живёте. Не выходите оттуда. Я с вами уже говорил на эту тему.
Реализацию сего тривиального декоратора можете спросить у своей любимой нейронки.
А вы, коллега, правда считаете, что придумать декоратор - это круто?
Я, вот, например, считаю, что круто - это обойтись без декоратора. Так, чтобы работало на уровне базы ;)
Круто - вырывать гланды через анус. Все стальное - скучные технические задачи: действительно позднее связывание, ленивое создание, автоматическое освобождение. Всего этого у вас нет, в отличие от все разрастающегося бойлерплейта.
У нас с вами, коллега, очень сильно разное чувство прекрасного. Моё, например, страдает от такой картины:

$hyoo_, а ещё с $mol_ не меньшеРазработчики языка специально в ES6 сделали возможность ограничивать область видимости объектов (let vs var). Понимали, что чем менее доступен объект, тем меньше поверхность атаки на него.
А разработчик $mol всё выложил в globals - скучное техническое решение с весёлыми последствиями. Каждый-всякий-любой может на странице https://mol.hyoo.ru/ сделать вот такое (в консоли или скриптом):
window.$mol_view=nullи получить такое после клика на любой ссылке:

А ведь, при желании, можно не просто тупо грохать приложение, а обернуть любой $mol-объект собственным кодом прямо с консоли браузера. Можно это представить как непревзойдённую расширяемость, а можно - как дыру для утечки конфиденциальных данных.
А попробуйте-ка с консоли получить доступ к моему контейнеру и его объектам хотя бы вот в этой демке (к этой статье). Ну как? О!
ES6-модули рулят с 2015-го года:
<script type="module">но ваша архитектура до сих пор тупо лезет в глобалс и подставляется через него :(
А что касается бойлерплейта, то в наш век автоматизации разработки ПО этот аргумент звучит жалко.
Очень хочется верить, что всю эту чушь вы нейронкой генерируете, не читая, но вы похоже действительно не понимаете как работает JS рантайм.

Да, я действительно по-другому, нежели вы, понимаю, как работает JS runtime. Но вы лично, и любой другой, можете повторить то, что я написал выше. Это скриншоты, а не нейрогенерёнка. Это повторяемо.
Размещать что-либо прикладное в globals после 2015-го года - это не олдскульно, а архаично.
console.log=nullВы, так-то изменили не объект, который мой контейнер генерирует, а окружение, в котором мой контейнер работает. Надеюсь, вы понимаете разницу :) К моим прикладным объектам (и самому контейнеру) из консоли у вас доступа нет.

Неплохо! Это всё ещё окружение, но тем не менее - это реальная возможность переопределить поведение порождаемых объектов.
В любом случае, спасибо за аргумент, коллега :) Меня тут на Хабре как-то уже ногами месили за то, что я использую замыкания в конструкторе вместо того, чтобы как "все нормальные люди" использовать классы и прототипы. Теперь, благодаря вам, я могу наглядно показать, почему я не делаю, как "все нормальные люди".
Переписал имплементацию логгера на замыкание:
export default class Client1_Di_Logger {
constructor() {
/** @type {Console|undefined} */
let consoleRef;
this.setConsoleLogger = (console) => {
consoleRef = console;
};
this.print = (msg) => {
consoleRef.log('Client1 logger: ' + msg);
};
}
}Теперь ваш трюк с Client1_Di_Logger не работает. Остальное в примере тоже можно через замыкания переписать (я пример специально делал в виде, наименее шокирующем нормальных людей). Принцип тот же. Но я думаю, вы уже и сами это поняли.
Вы пытаетесь решить несуществующую проблему.

Это вообще прекрасно! Тут уже без CSP не обойтись!
Пришлось переключиться на новую версию Контейнера (v2). Её как раз Codex сделал. В моей ручной версии был небезопасный код (new Function)
Сделал тестовый стенд, поставил в bootstrap задержку на 5 сек. Класс тот же - Client1_Di_Logger, метод тот же - print. Пробуйте.
Я, кстати, могу даже ваш код внутрь своего контейнера пустить. Если дадите адрес, где лежит js с именем типа Evil.js и кодом типа:
export const __deps__ = {
logger: "Client1_Di_Logger$",
};
export default class App_Evil {
constructor({ logger }) {
debugger;
}
}Сможете изнутри приложения попытаться logger переопределить.

Декларация (не)зависимостей для ESM