MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

WebAssembly.Table()

これは実験段階の機能です。
この機能は複数のブラウザーで開発中の状態にあります。互換性テーブルをチェックしてください。また、実験段階の機能の構文と挙動は、仕様変更に伴い各ブラウザーの将来のバージョンで変更になる可能性があることに注意してください。

WebAssembly.Table() コンストラクタは与えられたサイズと要素の型から Table オブジェクトを生成します。

これは、配列ライクな構造で表現された WebAssembly テーブルの JavaScript ラッパーオブジェクトです。JavaScript か WebAssembly コード上で生成されたテーブルは JavaScript、WebAssembly の両方からアクセス、変更可能です。

: 現在、テーブルには関数の参照のみ格納できます。しかし、将来的に拡張される予定です。

構文

var myTable = new WebAssembly.Table(tableDescriptor);

パラメータ

tableDescriptor
以下のメンバーを含むことができるオブジェクト:
element
テーブルに格納する値の型の文字列表現。現在は、"anyfunc" (関数) のみ設定できます。
initial
WebAssembly テーブルの初期要素数。
maximum Optional
WebAssembly テーブルが拡張できる要素の最大数。

例外

  • もし tableDescriptor がオブジェクト型でない場合、TypeError がスローされます。
  • もし maximum 定義されていて initial よりも小さい場合、RangeError がスローされます。

Table インスタンス

全ての Table インスタンスは Table()コンストラクタの プロトタイプオブジェクト を継承します。これは全ての Table インスタンスに影響するように変更可能です。

インスタンスプロパティ

Table.prototype.constructor
このオブジェクトのインスタンスを生成した関数を返します。デフォルトでは WebAssembly.Table() コンストラクタです。
Table.prototype.length
テーブルの長さを返します。すなわち、要素数です。

インスタンスメソッド

Table.prototype.get()
アクセサ関数。インデックスから格納された要素を取得します。
Table.prototype.grow()
指定した要素数で Table インスタンスを拡張します。
Table.prototype.set()
指定したインデックスに要素を格納します。

以下の例 (table2.htmlの ソースコード と 動作例 を参照) では初期サイズが2の WebAssembly Table インスタンスを生成しています。次に、テーブルの長さと2つのインデックスの内容を表示しています (長さが2で両方の要素が null であることを確認するために、Table.prototype.get() を使って読み込んでいます) 。

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"

次に、テーブルを含むインポートオブジェクトを作ります:

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

最後に、fetchAndInstantiate() ユーティリティ関数を使用して wasm モジュール (table2.wasm) をロードしてインスタンス化します。table2.wasm モジュールは2の関数を持っていて (1つは42を、もう1つは83を返す) 、インポートされたテーブルの0、1番目に両方の要素が格納されます (text representationを参照) 。そして、インスタンス化された後、テーブルの長さは2のままです。しかし、今はJSから呼び出し可能な エクスポートされたWebAssebly関数 が含まれています。

fetchAndInstantiate('table2.wasm', importObject).then(function(instance) {
  console.log(tbl.length);    // "2"
  console.log(tbl.get(0)());  // "42"
  console.log(tbl.get(1)());  // "83"
});

内部の値を表示するためには、参照された関数のアクセサの呼び出しの後に、2つ目の関数呼び出しを含める必要があることに注意して下さい (get(0) ではなく get(0)())。

この例では、JavaScript からテーブルを作成してアクセスしていますが、wasm インスタンス内で同じテーブルを参照して呼び出すこともできます。

仕様

仕様 策定状況 コメント
Web Assembly JavaScript API
Table の定義
ドラフト 初回ドラフト定義。

ブラウザ実装状況

Feature Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
基本サポート 57 15[2] 52 (52)[1] 未サポート 44 11
Feature Chrome for Android Android Webview Edge Mobile Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート 57 57 未サポート 52.0 (52)[1] 未サポート 未サポート 11

[1] WebAssemblyはFirefox 52+で有効です。Firefox 52 Extended Support Release (ESR.)では無効化されています。

[2] 現在、“Experimental JavaScript Features” フラグを付けることでサポートされます。詳細については このブログ記事 を参照してください。

関連情報

ドキュメントのタグと貢献者

 このページの貢献者: syu_kato
 最終更新者: syu_kato,