다음 생성자는 큰 관심을 갖고 정의되었습니다.
var Coder = function( nick ){
this.nick =
};
생성자를 정의한 후에는 어떻게 되나요? 맞습니다. 빠르게 인스턴스화하세요.
var coder = Coder( 'casper' )
이 코더 형제의 이름은 무엇인가요? 빠르게 인쇄하세요:
console.log( coder .nick ) ; //정의되지 않음
= =b는 실제로 정의되지 않았습니다! ! 인스턴스화 명령문을 다시 살펴보면 문제가 있는 위치를 찾는 것이 어렵지 않습니다. new
가 누락되었습니다. var coder = Coder( 'casper' ) // 일반 함수로 호출되므로 내부 this 포인터 실제로 창 객체를 가리킵니다
console.log( window.nick); //출력: casper
var coder = new Coder( 'casper' ) //new에서는 모든 것이 다릅니다. 현재 생성된 인스턴스
console.log( coder.nick ); //출력: casper
이 포인터를 가리키는 문제는 이 문서에서 논의되지 않습니다.
이러한 오류는 상당히 낮은 수준인 것처럼 보이지만 발생 가능성은 상당히 높습니다. 이 상황의 발생을 피하거나 줄이는 방법은 무엇입니까?
내부 구현을 시도해 볼 수 있습니다.
var Coder = function( nick ){
if( !(Coder의 이 인스턴스) ){
return new Coder( nick )
this.nick = nick; >}; 사실 매우 간단합니다. 인스턴스화할 때 이것이 가리키는 객체의 유형이 현재 생성자의 유형이 아닌 경우 생성자는 다음과 같습니다. 강제로 다시 전화를 받았습니다.
갑자기 Coder라는 이름이 촌스럽다고 느껴지시나요? Hacker를 사용하고 싶다면 바꾸겠습니다. . . 계산해 보면 세 가지를 변경해야 합니다. 이는 비과학적입니다. 생성자 이름만 바꾸는 방법이 있습니까?
물론이죠:
코드 복사
}
this.nick = nick;
팁
: ES 5의 엄격 모드에서는 Arguments.callee가 비활성화된다고 하는데, ES 5가 인기가 있고 엄격 모드를 사용하도록 지정한 경우에만, 그렇지 않으면 계속 사용할 수 있습니다. JQ에는 무적의 $가 포함되어 있습니다. 다음과 같이 jquery 객체를 반환한다는 것은 누구나 알고 있습니다.
var jObject = $('#node_id'); 여기에도 새로운 것이 없다는 것을 알고 계셨습니까? 무슨 일이 일어났는지 추측했어야 했어요. 원리는 비슷하지만 내부 구현은 훨씬 더 복잡합니다. JQ에서 구현을 분리하고 시간이 나면 요약을 작성하겠습니다.