原型js超级方法调用或类似的东西

时间:2014-05-26 08:27:06

标签: javascript prototypejs

Prototype js允许通过$ super调用super方法。我需要从object调用class-method,但是在override方法中,如下所示:

var ClassA = Class.Create({ 
  initialize: function(options) {
    Object.extend(this, options);
  },
  method1: function(){/*some code*/}
});

var ClassB = Class.Create(ClassA, {
  method1: function($super) {
    $super(); // this works fine, calls ClassA.method1()
  }
});

var objectA = new ClassA({
  method1: function($super) { // I need something like this
    $super(); // this not works, must calls ClassA.method1()
  }
});

我该怎么做?

3 个答案:

答案 0 :(得分:1)

如果您希望 objectA拥有新方法,请执行以下操作:

var objectA = new ClassA();

objectA.method1 = objectA.method1.wrap(function (fn) {
  fn(); // works like a `$super` call inside of a class
});

它使用Function#wrap为函数添加建议。

如果需要将参数传递给函数,请执行以下操作:

var objectA = new ClassA();

objectA.method1 = objectA.method1.wrap(function () {
  var args = $A(arguments), fn = args.shift();
  fn(args); // works like a `$super` call inside of a class
});

答案 1 :(得分:0)

如果要在已定义的类中重新定义方法,则需要使用Class#addMethods

var ClassA = Class.Create({ 
  initialize: function(options) {
    Object.extend(this, options);
  },
  method1: function(){/*some code*/}
});

ClassA.addMethods({
  method1: function() { 
    /** does something else **/
  }
});

但是这会覆盖method1方法,而不会创建原始方法的子类或子方法

http://api.prototypejs.org/language/Class/prototype/addMethods/

答案 2 :(得分:0)

根据我的需要,我会找到下一个决定:

function singleton() {
  var AnonymousClass = Class.create.apply(Class, arguments);
  return new AnonymousClass();
}

这个函数让我有机会覆盖类中的任何方法。 实施例

singleton(ClassA, {
  method1: function($super) {
  /* call of $super() */
  }
})

这项工作对我来说就像我想要的那样。函数返回我的对象​​与类中的重写方法,但此方法可以调用$ super。