Прототипы играют центральную роль в JavaScript, но в текущей практике структура прототипа отсутствует во внешних файлах и перестраивается по мере необходимости в соответствии с требованиями приложения. Дерево прототипов - это новый вид компонентов, который сохраняет структуру прототипа элементов JavaScript независимо от приложения.

Вот подробности. Под «деревом прототипов» я подразумеваю структуру, которая является деревом с точки зрения отношения объект-значение-собственное свойство, но в которой могут появляться цепочки и функции прототипов. Вот пример такой структуры:

Вот формальное определение.

Можно определить две операции, которые в сочетании делают деревья прототипов пригодными для использования в качестве компонентов: создание экземпляра и сериализация. Вместе они позволяют собирать приложения из сохраненных элементов. Сборки имеют единую структуру, которая хорошо сочетается с пользовательским интерфейсом, в котором представлена ​​структура прототипа. Идея была детально проработана для конкретного варианта использования: диаграмм. См. Https://prototypejungle.org.

Обычно создание экземпляра JavaScript - это одноуровневая операция, реализованная с помощью Object.create или new, в результате чего создается новый объект, наследующий свои свойства от оригинала. Для дерева прототипа создание экземпляра включает, очень грубо, построение нового дерева, которое наследует атомарные свойства, но копирует объекты. Новое дерево также сохраняет структуру наследования прототипа оригинала. Эффект состоит в том, что деревья произвольной глубины могут служить шаблонами, из которых экземпляры могут быть созданы одним ударом. Эта операция более подробно описана в конце этой заметки.

Вторая операция - сериализация. Это реализуется путем присвоения числовых кодов узлам графа объектов, которые необходимо сериализовать, и последующего построения JSON-совместимого описания графа, включая цепочки прототипов. Вот какой-то код.

В приложении для построения диаграмм компонентами являются визуальные элементы (стрелки, прямоугольники, метки и т. Д.) И их сборки (т. Е. Диаграммы и их части). Деревья-прототипы хорошо вписываются в приложение для построения диаграмм из-за многократного использования общих элементов в диаграммах, что фиксируется путем многократного создания экземпляров общих деревьев-прототипов. Становится возможной необычно тесная интеграция кодирования и работы с пользовательским интерфейсом, поскольку части сохраняют возможность настройки пользовательского интерфейса при сборке с помощью кода.

Реализация деревьев прототипов находится в свободном доступе по лицензии MIT.

Вот набросок того, как работает создание экземпляров:

Пусть T⁰ - структура, которую нужно создать. Сначала создайте глубокую копию T¹ из T⁰, но опустите атомарные и функциональные свойства, которые T¹ получит по наследству. T¹ также должен иметь те же края прототипа, что и T⁰. Затем привяжите цепочки прототипов T¹ обратно к T⁰: если цепочка прототипов в T¹ заканчивается в узле N¹, продлите цепочку обратно до узла N⁰, где N⁰ находится на том же пути в T⁰, что и N¹ в T¹. Чтобы понять, что происходит, вот простой пример. iii - это исходное дерево:

Затем после jjj = iii.instantiate ():

Так, например, jjj.bx имеет значение 1, поскольку jjj.b наследуется от jjj.a, который, в свою очередь, наследуется от iii.a. jjj.b.y имеет значение 2 по той же причине. Обратите внимание, что iii.b.z был скопирован в экземпляр, вопреки правилу, согласно которому границы атомарных свойств наследуются, а не копируются. Ну, я не упомянул каждую деталь алгоритма. Вот полное описание.