[英]JavaScript override class method conditionally
我有一個我定義的類,我在我的應用程序中使用。 我有一個頁面,我想更改覆蓋該類的所有實例上的一些方法。 這是一些代碼來說明。
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的實例調用重寫方法。
您可以存儲舊版本的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;
}
});
不確定這是否是最好的做法,但它可以讓你運行你想要的任何邏輯或只是返回原始方法,如果不需要...
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
嘗試執行以下操作:
MyClass.prototype.implement({
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.