WebAssembly.Table

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since October 2017.

Объект WebAssembly.Table() - это JavaScript обёртка — структура похожая на массив, представляющая таблицу функций WebAssembly. Таблица, созданная через JavaScript или в коде WebAssembly, будет доступна и может быть изменена как из JavaScript, так и из WebAssembly.

Примечание: Таблицы сейчас хранят только ссылки на функции, но это может быть расширено в будущем.

Конструктор

WebAssembly.Table()

Создаёт новый объект Table.

Экземпляры Table

Все экземпляры Table наследуются от прототипа конструктора Table(), следовательно изменения прототипа затронут все экземпляры Table.

Свойства экземпляра

Table.prototype.constructor

Возвращает функцию которая создала этот объект. По умолчанию это конструктор WebAssembly.Table().

Table.prototype.length

Возвращает длину таблицы (количество элементов в таблице).

Instance methods

Table.prototype.get(index)

Возвращает указанное значение из таблицы.

Table.prototype.grow(count)

Увеличивает размер таблицы на указанное количество элементов.

Table.prototype.set(index, value)

Сохраняет указанное значение в таблицу под указанным индексом.

Примеры

Следующий пример (смотри исходный код и живую версию table2.html) создаёт новый экземпляр WebAssembly Table с 2 элементами. После этого выводит длину таблицы и содержимое первых двух элементов (полученных через Table.prototype.get() чтобы показать что длина равняется 2 и элементы равны null.

js
var tbl = new WebAssembly.Table({ initial: 2, element: "anyfunc" });
console.log(tbl.length); // "2"
console.log(tbl.get(0)); // "null"
console.log(tbl.get(1)); // "null"

После этого мы создаём объект импорта содержащий таблицу:

js
var importObj = {
  js: {
    tbl: tbl,
  },
};

После этого, мы создаём экземпляр модуля wasm (table2.wasm) используя метод WebAssembly.instantiateStreaming(). Модуль table2.wasm содержит две функции, одна возвращает 42, а вторая - 83) и сохраняет эти функции под индексами 0 и 1 в импортированную таблицу (смотри текстовую версию). Таким образом, после создания wasm-модуля, таблица имеет туже длину, но элементы таблицы стали функциями экспортированными из WebAssembly которые можно вызывать из JS.

js
WebAssembly.instantiateStreaming(fetch("table2.wasm"), importObject).then(
  function (obj) {
    console.log(tbl.length);
    console.log(tbl.get(0)());
    console.log(tbl.get(1)());
  },
);

Заметьте что понадобилось добавить второй оператор вызова функции чтобы вызвать функцию возвращённую из талицы (т.е. get(0)() вместо get(0)) .

Этот пример показывает что мы создаём и работаем с таблицей из JavaScript, но экземпляр таблицы также виден и доступен внутри модуля wasm.

Спецификации

Specification
WebAssembly JavaScript Interface
# tables

Совместимость с браузерами

BCD tables only load in the browser

Смотрите также