我有一个像下面这样的类 - 这是库的一部分,我根本无法改变它(如果可以的话,我只是重写它或用Java子类化它)
public class FirstClass
{
public FirstClass(SecondClass arg)
{
...
}
public ThirdClass aMethod()
{
...
}
...
}
我想使用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;
}
...
}
但我似乎无法在Javascript中执行此操作。到目前为止我尝试过的事情......
function js_FirstClass(arg)
{
var temp = JavaAdaptor(FirstClass,
{
'<init>': FirstClass,
aMethod: function()
{
var toReturn = super.aMethod();
//Do stuff
return toReturn;
}
});
return temp;
}
我也试过......
var myClass = new FirstClass(secondClass);
myClass.aMethodOld = myClass.aMethod;
myClass.aMethod = function()
{
var toReturn = aMethodOld();
//Do stuff
return toReturn;
}
还有其他建议吗?
答案 0 :(得分:-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...
}
}
所以我的想法是你通过提供相同的方法(你需要手动注册每个方法)并将调用传递给隐藏的实例{{1}来创建一个行为类似于FirstClass
实例的JavaScript对象。 }。
不适用于inst
,但如果您只需要Duck typing,则非常有用。