<?xml version="1.0"?>
<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">
<article name="Предзагруженные объекты"
link="/ru/docs/njs/preload_objects.html"
lang="ru"
rev="3"
toc="no">
<section id="summary">
<para>
<note>
Предзагруженные объекты поддерживаются только в JavaScript-движке
<link doc="engine.xml" id="njs_engine">njs</link>
и недоступны в движке
<link doc="engine.xml" id="quickjs_engine">QuickJS</link>.
</note>
</para>
<para>
Для каждого входящего запроса в njs создаётся отдельная виртуальная машина.
Это позволяет прогнозировать предсказуемое поглощение памяти
или осуществить изоляцию запросов.
Однако поскольку все запросы являются изолированными, то
если обработчику запроса необходимо получить доступ к данным,
ему нужно сначала их прочитать самому.
Это неэффективно, особенно если объём данных большой.
</para>
<para>
Это ограничение можно обойти
при помощи разделяемого предзагруженного объекта.
Такие объекты создаются неизменяемыми и не имеют цепочки прототипов:
у них нет возможности
изменить значения или добавить/удалить свойства в объектах/массивах.
</para>
</section>
<section id="working_with_preload_objects"
name="Работа с предзагруженными объектами">
<para>
Примеры работы с предзагруженными объектами в njs:
<list type="bullet">
<listitem>
доступ к свойствам по имени:
<programlisting>
preloaded_object.prop_name
preloaded_object[prop_name]
</programlisting>
</listitem>
<listitem>
перечисление свойств:
<programlisting>
for (i in preloaded_object_name) {
...
}
</programlisting>
</listitem>
<listitem>
применение встроенных методов, не изменяющих состояние,
при помощи <literal>call()</literal>:
<programlisting>
Array.prototype.filter.call(preloaded_object_name, ...)
</programlisting>
</listitem>
</list>
</para>
</section>
</article>