2009-03-25 2 views
3

Rhino에서 JavaScript를 호스트 객체로 반환하는 가장 좋은 방법은 무엇입니까? 나는이 같은 두 개의 클래스가 있습니다Rhino에서 호스트 객체 반환

public class Hosted extends org.mozilla.javascript.ScriptableObject { 
    private static final long serialVersionUID = 1; 
    public Hosted() {} 
    public void jsConstructor() {} 

    public String getClassName() { 
     return "Hosted"; 
    } 

    public Member jsGet_member() { 
     Member m = new Member(); 
     m.defineFunctionProperties(new String[] { "toString" }, m.getClass(), DONTENUM); 
     return m; 
    } 
} 

public class Member extends org.mozilla.javascript.ScriptableObject { 
    private static final long serialVersionUID = 2; 
    public Member() {} 
    public void jsConstructor() {} 

    public String getClassName() { 
     return "Member"; 
    } 

    public String toString() { 
     return "called toString()"; 
    } 
} 

그것은 내가 toString 메소드를 호출 할 수 있습니다 의미에서 작동하지만 내가 예상하는대로 구성원 개체가 작동하지 않습니다

js> defineClass("Hosted"); 
js> defineClass("Member"); 
js> var h = new Hosted(); 
js> h.toString(); 
[object Hosted] 
js> h instanceof Hosted; 
true 
js> h.__proto__; 
[object Hosted] 
js> 
js> var m = h.member; 
js> m.toString(); 
called toString() 
js> m instanceof Member; // Should be true 
false 
js> m.__proto__; // Should be [object Member] 
null 

을 나는 경우 그것은 회원 객체 말할 않습니다,하지만 Object.prototype.toString 전화 : 내가 m.setPrototypeContext.javaToJS를 호출하려고했습니다

js> Object.prototype.toString.call(m); 
[object Member] 

합니다.

답변

4
public Scriptable jsGet_member() { 
     Scriptable scope = ScriptableObject.getTopLevelScope(this); 
     Member m = new Member(); 
     m.setParentScope(scope); 
     // defineClass("Member") must have previously been called. 
     m.setPrototype(ScriptableObject.getClassPrototype(scope, "Member")); 
     m.defineFunctionProperties(new String[] { "toString" }, 
       m.getClass(), DONTENUM); 
     return m; 
    } 

js> defineClass("Member") 
js> defineClass("Hosted") 
js> var h = new Hosted(); 
js> var m = h.member; 
js> m.toString(); 
called toString() 
js> m instanceof Member; 
true 
js> m.__proto__; 
[object Member] 

편집 : 방법도 쓸 수 있습니다 :

public Scriptable jsGet_member() { 
     Scriptable scope = ScriptableObject.getTopLevelScope(this); 
     Context cx = Context.getCurrentContext(); 
     Member m = (Member)cx.newObject(scope, "Member"); 
     m.defineFunctionProperties(new String[] { "toString" }, 
       m.getClass(), DONTENUM); 
     return m; 
    } 

Member.jsConstructor를 호출 할 것이다; 다른 차이점이있을 수도 있습니다.

+0

감사합니다. –

관련 문제