mja*_*ard 5 javascript java rhino
我有一个像下面这样的类 - 这是一个库的一部分,我根本无法改变它(如果可以,我会重新编写它或用 Java 子类化它)
public class FirstClass
{
public FirstClass(SecondClass arg)
{
...
}
public ThirdClass aMethod()
{
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想使用 Rhino 创建一个 Javascript 对象(所以没有关于 JavaScript 与 Java 不同的评论,我知道),但要覆盖方法“aMethod”。
所以在Java中,我会这样做......
public class MySpecialFirstClass extends FirstClass
{
public FirstClass(SecondClass arg)
{
super(arg);
}
public ThirdClass aMethod()
{
ThirdClass toReturn = super.aMethod();
//My implementation goes here.
return toReturn;
}
...
}
Run Code Online (Sandbox Code Playgroud)
但我似乎无法在 Javascript 中做到这一点。到目前为止我尝试过的事情......
function js_FirstClass(arg)
{
var temp = JavaAdaptor(FirstClass,
{
'<init>': FirstClass,
aMethod: function()
{
var toReturn = super.aMethod();
//Do stuff
return toReturn;
}
});
return temp;
}
Run Code Online (Sandbox Code Playgroud)
我也试过...
var myClass = new FirstClass(secondClass);
myClass.aMethodOld = myClass.aMethod;
myClass.aMethod = function()
{
var toReturn = aMethodOld();
//Do stuff
return toReturn;
}
Run Code Online (Sandbox Code Playgroud)
还有什么建议吗?
Aar*_*lla -1
尝试原型方法:
function newFirstClass(arg) {
// Create hidden instance
var inst = new FirstClass(arg);
return {
aMethod: function() {
var result = inst.aMethod();
// ... do stuff
return result;
}
// forward every other call directly to inst
otherMethod: function() {
return inst.otherMethod();
}
// etc...
}
}
Run Code Online (Sandbox Code Playgroud)
因此,我们的想法是,FirstClass通过提供相同的方法(您需要手动注册每个方法)并将调用传递给隐藏实例,创建一个行为类似于实例的 JavaScript 对象inst。
instanceof如果您只需要Ducktyping ,则无法使用但很有用。