2012-08-23 2 views
0

이 이중 컨텍스트 스위칭의 경우를 다루는 가장 좋은 방법을 찾고 있습니다. myObject2.someFunc에서javascript에서 이중 컨텍스트 스위칭

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의 데이터에 액세스 할 수 있도록 환경을 변경하는 호출을 사용합니다. 그러나 이것 때문에 myObject의 각 메소드에서 this는 이제 myObject2를 참조합니다. 호출을 사용하지 않으면 myObject2의 데이터에 액세스 할 수 없습니다.

나는 apply를 사용하여 원래 객체를 인수로 전달한 다음 다시 전달할 것을 생각했지만 myObject.each의 원래 defition을 변경하지 않아도되는 좀 더 우아한 솔루션을 찾고 있습니다.

감사합니다.

+0

이 코드가 실제로 작동하지 않는 이유는 무엇입니까? "each"함수는'func.call (this, key);로 쓰여 져야한다. 그렇지 않으면 "someFunc"의 콜백에서'this'가 작동하지 않을 것이다. – Pointy

답변

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

그래서, 간단합니다. 내가 너무 열심히 생각하고 있었다고 생각해. 감사! – William

관련 문제