2013-07-11 2 views
3

JavaScript 프로토 타입으로 Java 객체를 사용하는 데 어려움이 있습니다. 프로토 타입에 액세스 할 수있는 기능 속성은 개체 자체에 액세스 할 수 있어야합니다 :Rhino에서 Java Object를 프로토 타입으로 사용

var test = {}; 
test.prototype = new java.util.ArrayList(); 
test.prototype.add(1); // works 
test.add(1);   // fails 

이 결코 일어날 것을 나에게 보인다 : 이것은 내 문제를 보여줍니다.

제 목표는 래핑 된 Java 객체에 더 많은 함수 속성을 추가하는 것입니다. Rhino에서 원하는 효과를 얻으려면 적어도 해결 방법이 있습니까? 제약 조건은 JavaScript 측면에서 속성을 추가해야한다는 것입니다.

내 Rhino가 1.7R4입니다.

+0

왜'var test = new java.util.ArrayList();'가 아닌가? – Andremoniy

+0

@Andremoniy Java 객체에 속성을 추가하는 방법을 찾고 있습니다. –

답변

1

설명한대로 here, 해결 방법은 래핑 된 Java 객체의 프로토 타입을 new NativeObject()으로 설정하는 것입니다. 링크 된 스레드에서는 실제로 어떤 일을하는 것이 옳은지에 대한 어떠한 확인도 없었기 때문에 일이 발생하여이 사용 사례를 위해 작동하고 다른 사용자를 해칠 수 있습니다.

cx.setWrapFactory(new WrapFactory() { 
    @Override public Object wrap(Context cx, Scriptable scope, Object obj, Class<?> staticType) { 
    final Object ret = super.wrap(cx, scope, obj, staticType); 
    if (ret instanceof Scriptable) { 
     final Scriptable sret = (Scriptable) ret; 
     if (sret.getPrototype() == null) sret.setPrototype(new NativeObject()); 
    } 
    return ret; 
    } 
}); 

및 자바 스크립트 측

이 지금 작동합니다 :

어쨌든, 자바 측의 프로토 타입을 설정하는 가장 좋은 장소가 지정 wrapFactory에 따라서

var test = new java.util.ArrayList(); 
test.x = 'a'; 

비교 게시 된 시도에 대해 객체와 프로토 타입의 역할을 뒤 바꿔야합니다.

재미있는 것은 : 나에게

test.prototype = {}; 

이것은 코뿔소 버그 같은 소리, 또는 적어도 포인트 개선하기 위해 지금 자유롭게뿐만 아니라 자바 스크립트 측의 프로토 타입을 설정할 수 있습니다.

+0

'new NativeObject()'는 JS에서'{}'을하는 것과 완전히 똑같지는 않습니다. 누락 된 것은 기본 프로토 타입'Object'입니다. 이것을 고려해보십시오 :'NativeObject prototype = new NativeObject(); prototype.setPrototype (ScriptableObject.getObjectPrototype (scope)); sret.setPrototype (prototype);'예를 들어 프로토 타입이없는 NativeObject에는 기본 toString() 구현이 없습니다. 따라서 어딘가에서 인쇄하려고하면 오류가 발생합니다. –