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()
}
});
我该怎么做?
答案 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。