Return value: => [ window, 'one', 'two' ] 문제가 발생합니다. 이 값은 어떻게 window가 되었나요? 간단한 분석을 해보겠습니다. Javascript에는 전역 객체가 있습니다. 스크립트에 흩어져 있는 것처럼 보이는 모든 코드 줄은 실제로 전역 객체의 컨텍스트에서 작성됩니다. 실제로는 makeArray입니다. 함수는 느슨한 전역 함수가 아니라 전역 개체의 메서드라고 할 수 있습니다. 이 환경에서 해당 전역 개체는 창 개체에 매핑됩니다.
이 값은 object arrayMaker 자체가 왜 원래 함수 정의가 변경되지 않았는지, 왜 창이 아닌지 궁금할 것입니다. 함수는 객체이므로 매개변수 목록 및 함수와 함께 전체 함수를 전달하거나 복사할 수 있습니다. body를 복사하고 arrayMaker의 make 속성에 할당하면 다음과 같이 arrayMaker를 정의하는 것과 같습니다.
this.someProperty = 'whatever'; this.theArray = [ this, arg1, arg2 ] //인스턴스화 방법 선언 ArrayMaker.prototype = { someMethod: function () { alert( 'someMethod Called') }, getArray: function () { return this.theArray; } }; var am = new ArrayMaker( 'one', 'two' ) var other = new ArrayMaker( 'first', 'second' ) am.getArray( ) ; // 반환 값: => [ am, 'one' , 'two' ]
new 연산자가 함수 호출 앞에 표시된다는 점은 주목할 가치가 있습니다. , 함수는 전역 함수와 같으며 우리가 생성하는 속성은 전역 개체(창)에 생성되며 이를 원하지 않는 또 다른 주제는 생성자에 반환 값이 없기 때문에 사용하는 것을 잊어버렸다는 것입니다. new 연산자를 사용하면 일부 변수가 정의되지 않은 상태로 할당됩니다. 이러한 이유로 생성자 함수를 대문자로 시작하는 것이 좋습니다.
Javascript 함수 호출 규칙 3: MyFunction()과 같은 함수를 초기화 함수로 사용하면 Javascript 런타임은 새로 생성된 객체에 이 값을 할당합니다.