2012-12-10 3 views
0

나는 함수를 호출 할 때마다 다시 정의되지 않도록 클래스의 프로토 타입에 직접 메서드를 할당하는 것이 좋습니다.프로토 타입에 메서드를 정의하면 해당 메서드를 생성자에서 어떻게 호출해야합니까?

var A = function() { 
    this.prop = "A property"; 
} 
A.prototype.method = function() { 
    return "A method"; 
} 

이렇게 생성자에서 이와 같이 정의 된 메서드를 호출하려고합니다. 이것이 가능한가?

생성자 안에 스텁 메서드를 만드는 것은 프로토 타입의 함수 대신 호출되기 때문에 작동하지 않습니다. 이 작업을 수행 할 수있는 유일한 방법은 괄호 구문 this["initialize"]()을 통해 함수를 참조하는 것입니다.이 함수는 꽤 우아하지 않은 것처럼 보입니다.

var A = function (options) { 
    this["initialize"](options); // function isn't defined yet but will be soon! 
} 
A.prototype.initialize = function (options) { 
    // do something with options. 
} 

이것은 꽤 janky 같아서이 기능을 호출하는 데 가장 적합한 방법이 아닐 것입니다. 다른 방법이 있습니까, 아니면 뭔가 빠졌습니까?

+0

그건 그렇고, 내 경우에는 옵션 인자를 취하고 그 데이터로 인스턴스 메소드를 호출하여 옵션을 처리하는 생성자를 생성하려고합니다. 편집을 위해 +1 –

답변

6

마지막 방법은 정확하지만 따옴표는 필요하지 않습니다. A 가정

var A = function (options) { 
    this.initialize(options); 
}; 
A.prototype.initialize = function (options) { 
    // do something with options. 
}; 

this가 구성되는 새로운 객체에 대한 참조 생성자로 호출되고, 프로토 타입 체인은 이미 확립되어 있으므로 이미 initialize 방법에 대한 액세스를 갖는다.

물론 initialize을 프로토 타이핑 할 필요는 없습니다. 두 번 이상 호출하지 않으려는 경우 독립 실행 형 함수로 정의하는 것이 더 적합 할 수 있습니다.

var A = function (options) { 
    initialize(this, options); 
}; 
function initialize (obj, options) { 
    // do something with options. 
}; 

또는 생성자 함수에 바로 초기화 코드를 넣을 수 있습니다.

+1

+1 - 나는 그것을 코멘트에 넣을 수있는 방법을 생각해 내고 있었다. – Jeff

+1

확인. 이것이 새 인스턴스를 어떻게 참조 하는지를 생각할 때 당신의 설명은 완벽합니다. 필자는보다 강력하게 형식화 된 언어로 코딩하는 데 익숙해 져서 더러워졌습니다. 그러나 나는 그것을 극복해야 할 것 같아요. –

관련 문제