2

基本的に同じ方法で新しいメソッドにラップする必要があるメソッドがいくつかあります。私の最初の解決策は機能せず、その理由は理解できますが、この問題に対する簡単な解決策があるのか​​、それとも私が望む方法で解決できないのかはわかりません。

これが例です。onClickメソッドを持つオブジェクトacがあります。onClickメソッドの前にいくつかのコードを実行する必要があります。私は次のことを試しました:

// objects a-c
a = {onClick : function () { console.log('a'); }};
b = {onClick : function () { console.log('b'); }};
c = {onClick : function () { console.log('c'); }};

// first try
var arr = [a, b, c]
for (var i = 0; i < arr.length; i++) {
    var oldOnClick = arr[i].onClick;
    arr[i].onClick = function () {
        // new code here
        oldOnClick();
    }  
}

// outputs 'c'
// what i want is to maintain a reference to the original method
// so in this case, execute my new code and output 'a'
a.onClick();

新しいメソッドが呼び出されると、oldOnClickは、割り当てられたときのtoメソッドではなく、最後の反復からのメソッドを指すため、これは機能しません。

私が見落としている簡単な解決策はありますか?

4

4 に答える 4

3

必要なのは閉鎖です。

for(var i=0, l=arr.length; i<l; i++){
 (function(i){
   var oldOnclick = arr[i].onClick; 
   //etc.
 })(i);
}
于 2009-06-21T09:08:42.767 に答える
1

Javascriptのバインディングルールはかなり奇妙です。本当に、javascriptはかなり奇妙です。

これを修正方法と呼ぶかどうかはわかりませんが、サブ関数を導入することで、別のバインドを導入して、この特定の問題を修正できます。

(クイックy Chromeハッキング用に変更された)コードは次のようになります。

a = {onClick : function () { alert('a'); }};
b = {onClick : function () { alert('b'); }};
c = {onClick : function () { alert('c'); }};

var arr = [a, b, c]
for (var i = 0; i < arr.length; i++) {
    var oldOnClick = arr[i].onClick;
    arr[i].onClick = bind(oldOnClick);
}

a.onClick();
b.onClick();
c.onClick();

function bind(oldFunc)
{
    return function () {
        //New Code
        oldFunc();
    }  
}

上記のコードは、a、b、cの3つのアラートをスローします。'//NewCode'を置き換えるものはすべて適切なタイミングで実行されます。

于 2009-06-21T09:08:49.773 に答える
1

Javascript 用の AOP フレームワークを試してみましたか?

たとえば、jQuery AOP プラグインを使用します。

jQuery.aop.before( {target: String, method: 'replace'}, 
  function(regex, newString) { 
    alert("About to replace string '" + this + "' with '" + newString + 
          "' using regEx '" + regex + "'");
  }
);

こちらもチェック。

于 2009-06-21T09:11:31.420 に答える
0
var a = {onClick : function () { console.log('a'); }};
var b = {onClick : function () { console.log('b'); }};
var c = {onClick : function () { console.log('c'); }};

var arr = [a, b, c];
for (var i = 0; i < arr.length; i++) {
    var oldOnClick = arr[i].onClick;
    arr[i].onClick = wrapHandler(oldOnClick);  
}

function wrapHandler(handler) {
    return function() {
        console.log("New stuff");
        handler();
    }
}

a.onClick(); // outputs "New stuff" then "a"
b.onClick(); // outputs "New stuff" then "b"
b.onClick(); // outputs "New stuff" then "c"
于 2009-06-21T15:48:46.097 に答える