4

javascriptオブジェクトがある場合、通常は次のようにオブジェクトとそのメソッドを操作します。

var obj = someObject.getInstance();
var result = obj.someMethod();

ここで、someMethodは次のように定義されます。

someObject.prototype.someOtherMethod = function() { //do stuff };
someObject.prototype.someMethod = function(foo) { this.someOtherMethod(); };

ただし、ExecJSを介してRubyでsomeMethodを呼び出したい場合、エラーが発生します。

context = ExecJS.compile(# the javascript file)
context.call('someObject.getInstance().someMethod') 
# Gives a TypeError where Object has no method 'someOtherMethod'

一方、javascriptモジュールで定義されている関数は正常に機能しています。

someFunction = function() { // do stuff };

# in Ruby
context.call('someFunction') # does stuff

ExecJSはJavascriptオブジェクトとそのメソッドを処理できますか、それともそれを使用して関数を呼び出すことしかできませんか?

特定のアプリケーションに関しては、https://github.com/joenoon/libphonenumber-execjsを調べていますが、上記の理由でLibphonenumberの解析機能が機能しません。

4

1 に答える 1

3

いくつかの実験を通じて答えを発見しました。呼び出しの代わりに context.exec() を使用して、目的の機能を取得することができました。

js = <<JS
var jsObj = someObject.getInstance();
var res = jsObj.someMethod();
return res;
JS

context.exec(js);

ただし、メソッドが Javascript オブジェクトを返す場合は、ExecJS によって適切な Ruby オブジェクトに返されるように、最初にそれをシリアル化するか、結果を解析する必要があります。

于 2012-12-24T01:37:58.810 に答える