当我需要使用带参数的构造函数时,如何使用Rhino子类化(扩展)Java类?

时间:2011-10-19 14:23:22

标签: java javascript rhino

我有一个像下面这样的类 - 这是库的一部分,我根本无法改变它(如果可以的话,我只是重写它或用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;
}

还有其他建议吗?

1 个答案:

答案 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,则非常有用。