JavaScriptバインディングの書き方
※この記事はJSX Advent Calendar 2013の一部です。
JSXでは、JavaScriptで定義されているオブジェクトをJSXのクラスとして簡単に取り込めるようになっています。やりかたは簡単。「native」属性を付与してクラス定義を書くだけです。たとえばJavaScriptの組み込みオブジェクトであるRegExpのバインディングは、以下のように定義されています。
native final class RegExp { function constructor(pattern :string, flags :string); function constructor(pattern :string); function constructor(pattern :RegExp); function exec(str :string) :string[]; function test(str :string) :boolean; override function toString() :string; __readonly__ var source :string; __readonly__ var global :boolean; __readonly__ var ignoreCase :boolean; __readonly__ var multiline :boolean; __readonly__ var lastIndex :int; }
native属性以外に注目すべきところとして、プロパティに__readonly__属性を付与して読み込みのみ可能としている点*1があげられるかと思います。
また、node.js等でrequireを使ってロードするオブジェクトについては、以下のようにすることで、対応する表現を定義することができます*2。
native class url { static function parse(urlStr : string) : Url; static function format(url : Url) : string; static function format(urlStr : string) : string; static function resolve(source : Url, relative : Url) : string; static function resolve(source : Url, relative : string) : string; static function resolve(source : string, relative : Url) : string; static function resolve(source : string, relative : string) : string; } = "require('url')";
*1:これはnativeクラス専用の拡張です
*2:GitHub - jsx/nodejs.jsx: (to be) the node.js binding for JSXより抜粋