2015-09-09 128 views
2

我在Java中嵌入Rhino,我想用getter和setter创建一个全局属性。该非全局属性定义的工作原理:如何在犀牛中定义全局属性?

var testObj = {}; 
Object.defineProperty(testObj, 'testPropName', { 
    set: function(value) { print('setter called w/' + value); } 
}); 

如果我尝试瓦特/全球 “这种” 反对它抛出一个错误:

Object.defineProperty(this, 'testPropName', { 
    set: function(value) { print('setter called w/' + value); } 
}); 

错误:

TypeError: Expected argument of type object, but instead had type object (#1) in at line number 1 

创建它从Java方面来说也不错,但我也没有那么幸运。

回答

0

从Java方面的技术方案...

public class MyCustomBindings extends SimpleBindings { 

@Override 
public Object put(String name, Object value) { 
    Object result = super.put(name, value); 
    // "setter" logic 
    return result; 
} 

@Override 
public Object get(Object key) { 
    // "getter" logic 
    return super.get(key); 
} 

和其他地方...

ScriptEngineManager factory = new ScriptEngineManager(); 
engine = factory.getEngineByName("JavaScript"); 
MyCustomBindings bindings = new MyCustomBindings(); 
engine.getContext().setBindings(bindings, ScriptContext.ENGINE_SCOPE);