次の手順でBrythonからJavaScriptのクラスを直接使うことができる。JavaScript側の自作クラスをPythonで使う例はいくつか見かけたが、組込関数はどうかと思って試してみた。
- browserモジュールからwindowオブジェクトをインポートする
- JSConstructor()関数の引数にJavaScriptの組み込みクラスのコンストラクタを与えてPythonとしてのコンストラクタを得る
- ()や引数はつけない
- 引数に与えるJavaScriptのコンストラクタはwindowオブジェクトに属している
- 上のコンストラクタを使ってインスタンスを生成
たとえばJavaScriptの組込クラスArrayを使ってみる。
|
from browser import window from javascript import JSConstructor Array = JSConstructor(window.Array) array = Array("one", "two", "three") print(array) # ['one', 'two', 'three'] |
Arrayオブジェクトをつくると、Pythonのリストとして生成されているらしい。メソッドも使えそう。
|
array.reverse() print(array) # ['three', 'two', 'one'] array.sort() print(array) # ['one', 'three', 'two'] |
ところがtoString()メソッドを使おうとするとエラーに。
|
print(array.toString()) # AttributeError: 'list' object has no attribute '$$toString' |
これを見ると、JavaScriptのコンストラクタを使っているが、Pythonではリストとして解釈されるので、メソッドが存在しない、とエラーになる。上のreverse()
やsort()
は、JavaScriptのArrayクラスのメソッドではなく、Pythonのリストオブジェクトのメソッドとして解釈・実行されたということになる。
Pythonのクラスに定義されていないプロパティにアクセスした場合もエラーになる。
|
print(len(array)) # 3 print(array.length) # AttributeError: 'list' object has no attribute 'length' |
もともとBrythonに該当するものがないJavaScriptのクラスの場合。たとえばPath2Dをつくってみると、JSObjectでラップされたオブジェクトになっているらしい。
|
from browser import window from javascript import JSConstructor Path2D = JSConstructor(window.Path2D) path = Path2D() print(path) # <JSObject wraps [object Path2D]> |
このPath2DオブジェクトのmoveTo()
やlineTo()
といったメソッドは問題なく機能して、canvasに描画することができる。