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より抜粋