2011-01-23 36 views
2

我有一個類,我已經定義了我在整個應用程序中使用的類。我有一個頁面,我希望改變這個類的所有實例的一些方法。這裏有一些代碼來說明。有條件地JavaScript重寫類方法

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的實例調用重寫的方法。

回答

8

你可以保存舊版本的foo,基本上是貝爾巴托夫的作用:

var foo = MyClass.prototype.foo; 
MyClass.implement('foo', function(){ 
    return foo.call(this) * -1; 
}); 

或者你可以使用從MooTools的Class.Refactor更多與previous方法:

Class.refactor(MyClass, { 
    foo: function(){ 
     return this.previous() * -1; 
    } 
}); 
-1

試着做以下幾點:

MyClass.prototype.implement({ 
+0

是什麼呢? – 2011-01-23 03:17:30

+0

它將該函數應用於類本身,而不是其對象實例。 – 2011-01-23 06:22:25

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 

http://www.jsfiddle.net/dimitar/cXTrD/7/