Thanks Andreas.

Hi Tim,

In addition to JSAdapter, there is also jdk.nashorn.api.scripting.JSObject. Any Java class can implement this interface to trap get/set indexed/named properties, call/new.

See also https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes

And this interface can also be implemented in script - as usual. See $nashorn_repo/test/script/basic/JDK-8024847.js as well.

-Sundar

On Saturday 01 March 2014 04:30 PM, Andreas Rieber wrote:
Hi Tim,

this is possible with JSAdapter described in [1].

Short sketch could look like this:

---
var myobj = (function () {

    return new JSAdapter() {
        __get__: function(name) {
            print("getter called for '" + name + "'"); return name;
        },

        __put__: function(name, value) {
            print("setter called for '" + name + "' with " + value);
        }
    }
})();

myobj.x;
myobj.x = 12;
myobj[3];
---
output:

getter called for 'x'
setter called for 'x' with 12
getter called for '3'
---

happy scripting
Andreas

[1] https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions


On 01.03.2014 10:27, Tim Fox wrote:
Hello Nashorn folks,

I have a JavaScript object, and I'd like to 'override' what the index operator [] does on it.

I.e. when I do

var x = myobj[3];

I actually want it to call some other function on the object, e.g.

myobj.get(3);

I'm pretty sure this isn't possible in pure JS, so I was thinking of wrapping a Java Object as a JavaScript object, e.g. if I have

public class MyJavaClass {
   public Object get(int index) {
      ...
      return something;
   }
}

I would like to have a JS wrapper for it, such that when I call:

var x = myJavaWrapper[3];

It actually calls:

myJavaObject.get(3);

Is this possible in Nashorn?


Reply via email to