invoking method of nested js objects

A. Sundararajan sundararajan.athijegannathan at oracle.com
Tue Sep 3 21:42:48 PDT 2013


Hi,

You can only invoke a global function or a method on a specific object - 
for the former you'd use Invocable.invokeFunction and for the later 
Invocable.invokeMethod.

invokeMethod requires specific script object, name of the method and the 
arguments. invokeFunction requires the global function name and the 
arguments.

"x.a.b.c" is not a function - it evaluates to a function when executed 
as a script. So, in your case, you could do something like:

   inv.invokeMethod(engine.eval("x.a.b"), "c", 2, 3);

Please note that engine.eval("x.a.b") evaluates as the script object on 
which the desired method in defined. "c" is the method name.

Hope this helps,
-Sundar

On Wednesday 04 September 2013 04:50 AM, Viktor Gamov wrote:
> Hello nashorn team,
>
> I have a question regarding how to invoke function that deeply nested inside object.
> Here is example:
>
> @Test
> public void useCase_7() throws ScriptException, LoadError, NoSuchMethodException {
>      engine.eval("x = {a: {b: {c: function(a, b) { return a + b } } } }");
>      Invocable inv = (Invocable) engine;
>      Assert.assertEquals("function reference chain", inv.invokeFunction("x.a.b.c", 2, 3), 5.0);
> }
>
> And I'm getting java.lang.NoSuchMethodException: No such function x.a.b.c
>
> Invoke method doesn't seem to work as well.
>
> @Test
> public void useCase_8() throws ScriptException, LoadError, NoSuchMethodException {
>      engine.eval("x = {a: {b: {c: function(a, b) { return a + b } } } }");
>      Invocable inv = (Invocable) engine;
>      Object x = engine.get("x");
>      Assert.assertEquals("function reference chain", inv.invokeMethod(x, "a.b.c", 2, 3), 5.0);
> }
>
> What is correct way to do that?
> Please, advice
> Thanks		
>
> -- 
> With Best Regards,
> Vik Gamov



More information about the nashorn-dev mailing list