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

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 ,则无法使用但很有用。