Estoy usando una antigua biblioteca de Mozilla Rhino (versión 1.7.7.1) en mi proyecto y me cuesta entender cómo implementar correctamente la jerarquía de objetos del host.
Lo que estoy tratando de hacer es tener un objeto host raíz que contenga un campo que sea otro Scriptable. Este campo contiene un mapa interno con claves de cadena y otro objeto programable ( Map<String, ListObject> ). ListObject contiene una colección de cadenas interna y funciones personalizadas.
Creé un código de ejemplo que contiene el ejemplo del objeto host y los campos. El repositorio está aquí . La prueba incluida se puede ejecutar con el comando mvn test .
Cuando trato de ejecutar el siguiente código, todo funciona como se esperaba:
var objectMap_foo_0 = root.objectMap['foo'][0]; var objectMap_foo_0_split = objectMap_foo_0.split('|'); El root.objectMap['foo'][0] devuelve una cadena y puedo llamar a la función de split de JavaScript en ella.
Pero también necesito poder ejecutar lo siguiente:
// should return first value in the inner collection as a default and do split on it var objectMap_foo = root.objectMap['foo']; // call custom method (length() in this case) print(objectMap_foo.length()); var objectMap_foo_split = objectMap_foo.split('|'); El root.objectMap['foo'] debería devolver el primer valor en la colección interna (que es una cadena), pero en este momento devuelve el objeto ListObject . La solución actual me permite llamar a la función personalizada length() en el objeto, pero no puedo usar la función de split porque el valor devuelto no es de tipo cadena. El mensaje de error que recibo al ejecutar el código anterior es:
org.mozilla.javascript.EcmaError: TypeError: Cannot find function split in object bar|baz. (script.js#14) ¿Puede alguien ayudarme a lograr la funcionalidad deseada para que se puedan usar tanto la función personalizada length() como la función javascript split() ?