0

この二重コンテキスト切り替えのケースに対処する最善の方法を探しています。

function myObject() {
    this.data = {};
}

myObject.prototype.each = function(func) {
    if (func) {
        for (var key in this.data) {
            func(key);
        }
    }
}

function myObject2() {
    this.data = {};
}

myObject2.prototype.someFunc = function(o) {
    // o = myObject
    o.each.call(this, function(key) {
        this.data[key] *= o.data[key];
    });
}

myObject2.someFunc では、call を使用してコンテキストを変更し、myObject2 のデータにアクセスできるようにします。ただし、このため、myObject の各メソッドでは、これは myObject2 を参照するようになりました。call を使用しないと、myObject2 のデータにアクセスできません。

apply を使用し、元のオブジェクトを引数として渡して戻すことを考えましたが、myObject.each の元の定義を変更する必要のない、より洗練されたソリューションを探しています。

ありがとう!

4

1 に答える 1

1

それは一般的な関数であるように見えます:

function each( obj, func, ctx ) {

    if( func ) {
        for ( var key in obj ) {
            func.call( ctx || null, key, obj[key] );
        }
    }

}

myObject2.prototype.someFunc = function(o) {
    each( o.data, function( key, value ) {
        this.data[key] = value;
    }, this );
};
于 2012-08-23T17:44:52.623 に答える