티스토리 뷰
1. arguments 객체
arguments 객체는 다음과 같이 구성되어 있다.
- 함수를 호출할 때 넘겨진 인자(배열 형태)
- length 프로퍼티 : 호출할 때 넘겨진 인자 개수
- callee 프로퍼티 : 현재 실행 중인 함수의 참조값
arguments 객체는 배열이 아니므로 배열 메서드를 사용할 경우 에러가 발생한다는 것에 주의해야 한다.
2. 호출 패턴과 this 바인딩
1) 객체의 메서드 호출 시 this 바인딩
객체의 프로퍼티가 함수일 경우, 이 함수를 메서드라고 한다.
메서드를 호출할 때, 메서드 내부 코드에 사용된 this는 해당 메서드를 호출한 객체로 바인딩된다.
2) 함수 호출 시 this 바인딩
내부 함수가 this를 참조하는 자바스크립트의 한계를 극복하려면 부모 함수의 this를 내부 함수가 접근 가능한 다른 변수에 저장하는 방법을 사용한다.
자바스크립트에서는 이와 같은 this 바인딩의 한계를 극복하려고, this 바인딩을 명시적으로 할 수 있도록 call과 apply 메서드를 제공한다.
또한 jQuery, underscore.js 등과 같은 자바스크립트 라이브러리에서는 bind라는 이름의 메서드를 통해 사용자가 원하는 객체를 this에 바인딩할 수 있는 기능을 제공한다.
3) 생성자 함수를 호출할 때 this 바인딩
생성자 함수가 동작하는 방식
1. 빈 객체 생성 및 this 바인딩
2. this를 통한 프로퍼티 생성
3. 생성된 객체 리턴
// 생성자 함수의 동작 방식
var Person = function(name) {
// 함수 코드 실행 전 - 1
this.name = name;
// 함수 리턴 - 2
};
var foo = new Person('foo');
console.log(foo.name);
1. Person() 함수가 생성자로 호출되면, 함수 코드가 실행되기 전에 빈 객체가 생성된다.
여기서 빈 객체는 Person() 생성자 함수의 prototype 프로퍼티가 가리키는 객체(Person.prototype 객체)를 [[Prototype]] 링크로 연결해서 자신의 프로토타입으로 설정한다. 그리고 이렇게 생성된 객체는 this로 바인딩된다.
2. 리턴값이 없으므로 this로 바인딩한 객체가 생성자 함수의 리턴값으로 반환되어 foo 변수에 저장된다.
객체 리터럴 방식과 생성자 함수를 통한 객체 생성의 차이
객체 리터럴 방식은 자신의 프로토타입 객체가 Object이며, 생성자 함수 방식의 경우는 Children 이다.
이러한 차이가 발생하는 이유는 자바스크립트의 객체 생성 규칙 때문이다.
자바스크립트 객체는 자신을 생성한 생성자 함수의 prototype 프로퍼티가 가리키는 객체를 자신의 프로토타입 객체로 설정한다.
객체 리터럴 방식에서는 객체 생성자 함수는 Object()이며, 생성자 함수 방식의 경우는 생성자 함수 자체,
두 가지 방식이 다른 프로토타입 객체가 있는 것이다.
'JavaScript' 카테고리의 다른 글
함수의 다양한 형태 (0) | 2018.01.15 |
---|---|
함수 객체 (0) | 2018.01.13 |
함수 선언 (0) | 2017.12.30 |
자바스크립트 패턴 - 객체 생성 패턴 (0) | 2017.10.28 |
자바스크립트 패턴 - 함수 (0) | 2017.09.24 |