2011-12-16 1 views
9

이 'Controller'객체의 생성자를 원숭이 패치하고 싶습니다. 하지만 원저작을 호출 할 수 있도록 생성자 함수에 원숭이 패치를 적용하려면 어떻게해야합니까? 이것이 제가 시도한 것입니다.어떻게 개체의 생성자 함수를 원숭이가 패치합니까?

// original 
function Controller() { 
    this._tag = 'div'; 
} 
Controller.prototype.tag = function() { 
    console.log(this._tag); 
} 

var c = new Controller(); 
c.tag(); // -> 'div', as expected 


// patch attempt 
var original = Controller; 
Controller = function() { 
    original.apply(this); 
    this._tag = 'patched'; // patch 
} 

var c = new Controller(); 
c.tag(); // no method tag, prototype appears wiped... 
+0

RHS 함수 표현식 주위의 그룹화 연산자가 불필요합니다. "생성자"는 다른 함수 내부에서 선언되므로 코드를 빠뜨린 코드가 외부 익명 함수 또는 다른 객체의 속성이 아닌 이상 외부에서 액세스 할 수 없습니다. 그래서 "원숭이 패치"생성자 (그게 무슨 뜻이든), 당신이 의견을 가지고 코드를 삽입하는 유일한 방법입니다 싶습니다. – RobG

+0

@RobG 호기심이 심하다면 : http://en.wikipedia.org/wiki/Monkey_patch 원숭이에게 아주 솔직하게 속성이나 메소드를 패치합니다.하지만 생성자 함수가 특별한 상태로 인해 나는 손실을 입었습니다. 이것이 가능하지 않을 수도 있습니다. 그러나 귀하가 아직 언급하지 않은 이유에 대해서는 확실하지 않습니다. 반영 할 코드 샘플을 업데이트하겠습니다. –

+0

은 더 나은 코드 샘플을 추가했습니다. –

답변

8

당신은 같은 것을하고 싶은 것 빌더 기능 객체를 구축 고려할 수 :

Constructor.prototype.oldTag = Constructor.prototype.tag; 

Constructor.prototype.tag = function() {/* whatever */}; 

지금 모든 인스턴스가 새로운 태그 방법을 얻을 수를 원하는 경우 oldTag으로 전화를 걸 수 있습니다.

var oldConstructor = Constructor; 

var Constructor = function() { /* new constructor */ }; 
Constructor.prototype = oldConstructor.prototype; 

는 이제 모든 이전 방법과 새로운 생성자가 :

또는 아마도 당신이 그런 짓을하고 싶습니다. 또는 위의 두 가지를 모두 수행하십시오. 단순히 영어를 사용하여 원하는 것을 말하십시오.

+0

감사합니다. 지금까지 내가하려는 일은 불가능한 것 같습니다. –

2

클리너 방법은 생성자를 패치 원숭이되지 않습니다 :/별도의 init 방법과 원숭이 패치에 생성자 논리를 넣어 그 대신을 상속합니다.

function Constructor(){ 
    this.init(); 
} 
Constructor.prototype.init = function(){ /*...*/ }; 

또한

function make_fancy_obj(){ 
    var obj = new Constructor(); 
    obj.foo = 'bar'; 
    return obj; 
} 
+0

맞춤법을 고쳤습니다. 기능이 기능이되었습니다. 나 신경 쓰지 마. – MrBoJangles

+1

@MrBoJangles : 마침내 우주를 지배 할 때, 나는 모든 funcitons를 함수로 바꿀 물리 법칙을 바꿀 것입니다. 그럼 내 모든 문제가 해결 될 것입니다 – hugomg

+2

불행히도 원래 생성자에 액세스 할 수 없습니다. 그래서 내가이 길로 갈거야. 제 예제에서 원본을 수정하지 않고도이 작업을 수행 할 수 있습니까? –