2011-01-23 11 views
2

私は自分のアプリケーション上で使用することを定義したクラスを持っています。クラスのすべてのインスタンスのメソッドのいくつかをオーバーライドして変更したいページが1つあります。説明するコードがいくつかあります。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を入れてからmy-script-jを変更すると表示されます:

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; 
}); 

それとも、もっとprevious方法でMooToolsのからClass.Refactorを使用することができます。

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

+1 for class.refactor –

+0

Class.refactorは私が探していたものです –

-1

次の操作を実行してみてください。

MyClass.prototype.implement({ 
+0

それが何をするのでしょうか? –

+0

この関数は、そのオブジェクトインスタンスの代わりにクラス自体に関数を適用します。しかし、 –

+0

の実装は.prototypeメソッドではありませんか? –

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/

関連する問題