我有一个我定义的类,我在我的应用程序中使用。我有一个页面,我想更改覆盖该类的所有实例上的一些方法。这是一些代码来说明。
MyClass的-的script.js
var MyClass = new Class({
foo: function() {
return 1;
},
bar: function() {
return this.foo() + 9;
},
});
变化MyClass的-的script.js
MyClass.implement({
foo: function() {
return this.parent() * -1;
},
});
如果我在页面上包含myclass-script.js,我应该看到:
var test = new MyClass();
test.bar() === 10; //true
如果我包含myclass-script.js然后更改-myclass-script.js,我应该看到:
var test = new MyClass();
test.bar() === 8; //true
我遇到的问题是MyClass.implement适用于MyClass的所有实例,但它不会“覆盖”该方法,它会替换它。所以this.parent()调用失败,因为该方法没有父级。如果我做MyClass.extend它不适用于我想要的,我没有看到MyClass的实例调用重写方法。
答案 0 :(得分:8)
你可以存储旧版本的foo,基本上是Dimitar所做的:
var foo = MyClass.prototype.foo;
MyClass.implement('foo', function(){
return foo.call(this) * -1;
});
或者您可以使用previous
方法从MooTools More中使用Class.Refactor:
Class.refactor(MyClass, {
foo: function(){
return this.previous() * -1;
}
});
答案 1 :(得分:2)
不确定这是否是最佳做法,但它可以让您运行您想要的任何逻辑,或者只是在不需要时返回原始方法......
var MyClass = new Class({
foo: function() {
return 1;
},
bar: function() {
return this.foo() + 9;
}
});
var f = new MyClass();
console.log(f.bar()); // 10
(function() {
var orig = MyClass.prototype.foo;
MyClass.prototype.foo = function() {
return orig.apply(this, arguments) * -1;
};
})();
console.log(f.bar()); // 8
答案 2 :(得分:-1)
尝试执行以下操作:
MyClass.prototype.implement({