2012-10-10 2 views
0

생성자 내부에서 찾을 함수를 편집해야합니다. 예 :JavaScript에서 생성자 내부의 함수를 변경하는 방법은 무엇입니까?

some.thing = function() { 
    this.somefn = function() { // this is the function that I need to fix 
     ... 
    } 
} 

그러나 기능을 편집해야합니다 단지에만이 생성자에 의한 만든 개체에 대한 하나의 오브젝트 (new obj = some.thing();)하지만 olso합니다.

그런 내부 기능을 편집 할 수있는 방법이 있습니까?

감사

+1

왜 내부 기능이다

var test = function() { /*InjectionPlace*/ }; eval("var newTest = " + test.toString().replace( "/*InjectionPlace*/", "var i = 10; alert(i);" )); test(); newTest(); 

건배 여기 –

+1

아니요 ... 새로 만든 인스턴스마다 'obj.somefn'을 덮어 쓸 수 있습니다. –

+0

@FelixKling OP가 선언을 제어하지 않고 프로토 타입 ... –

답변

2

프로토 타입에 기초하여 솔루션 생성자 생성자의`.prototype`에? 생성자에서 변수 액세스가 필요합니까?
+0

예! 그게 효과 야! 매우 빠른 것처럼 보입니다. 고맙습니다! –

+0

니스. 이러한 조정을 확인해 보면'Old'가 오염되지 않도록하고'new '로 호출하는 것을 피할 수 있습니다. http://jsfiddle.net/V6zve/ –

2

솔루션은 조금 너무 명백한 것, 그래서 문제가 원래 코드에 액세스하지 않는 것이 있는지 궁금 해요, 당신은보다 동적 인 솔루션이 필요합니다.

그렇다면 하나의 옵션 으로 생성자를 사용자 지정 생성자로 재정의하고 원본을 호출 한 다음 개체를 업데이트해야합니다.


원래 코드 :

some.thing = function() { 
    this.somefn = function() { // this is the function that I need to fix 
     ... 
    } 
} 

귀하의 코드 : 이제

 // cache a reference to the original constructor 
var _thing = some.thing; 

       // your constructor 
some.thing = function() { 

      // invoke the original constructor on the new object. 
    _thing.apply(this, arguments); 

    this.somefn = function() { /*your updated function*/ }; 
}; 

     // maintain inheritance 
some.thing.prototype = Object.create(some.thing.prototype); 

    // make an instance 
var theThing = new some.thing(); 

원래 생성자와 프로토 타입 체인의 이익을 얻고 있지만, 당신은 자신의 기능을 bjects가 생성되고 있습니다.

대체 한 원래 함수가 원래 생성자의 가변 범위를 특수하게 사용할 수있는 경우에만 문제가 발생할 수 있습니다. 그렇다면 해결해야 할 문제가 있습니다.

사용자가 호출하기 전에 덮어 쓴 원래의 메소드를 유지하고 호출 할 수 있습니다. 이 상황이 그렇게 부르는지 확실하지 않습니다.

+0

불행히도 작동하지 않습니다. Chrome에서 'RangeError : Maximum call stack size exceeded'오류가 발생했으며 함수는 여전히 동일합니다. –

+0

@NikitaGavrilov : 그런 다음 다른 방식으로 작업했습니다. 여기에 데모가 있습니다. http://jsfiddle.net/xzW9Z/ 새 생성자가 원본이 아니라 자신을 호출하는지 확인하십시오. –

+0

무거운 생성자로 인해 오류가 발생할 수 있습니까? –

0

저는 지난 주에 당신이 필요로했던 것을 정확히 알고 있습니다. 난 그냥 자바 스크립트에서 완전한 상속 모델을 구현하고 내가 아는 한, 생성자를 재정의하고 자식 클래스가 초기화 될 때 부모 클래스의 ctor를 호출하는 데 문제가있었습니다.

그래서 디자인에서 몇 가지 사항을 수정하면 문제가 해결되어 이제는 매력처럼 작동합니다! (C#과 비슷한 내용이지만 자바 스크립트와 비슷합니다.)

그런데이 방법으로 내용을 변경하라고 제안하는 것은 아니지만 여기서는 이렇게하는 방법이 있습니다. (나는 이런 식으로하지 않았으며 AGIAIN I IT 권장하지 않는다 다른 많은 방법이 있지만, 이것은) 쉬운된다.

var Something = function() { 
    this.f = function() { 
     console.log("Something"); 
    };  
}; 
var Old = Something; 
var Something = function() { 
    Old.apply(this); 
    this.f = function() { 
     console.log("New"); 
    }; 
}; 
Something.prototype = new Old(); 

var s = new Something(); 
s.f(); // prints "New" 
관련 문제