-
객체 - new 연산자와 생성자 함수Javascript 2021. 7. 3. 18:03
객체 리터럴 {}을 사용하면 객체를 쉽게 만들 수 있지만 유사한 객체를 여러 개 만들어야 할 때가 생기곤 한다. 이럴때 new 연산자와 생성자 함수를 사용하면 유사한 객체 여러 개를 쉽게 만들 수 있다.
생성자 함수는
1. 함수 이름의 첫 글자를 대문자로 한다.
2. 반드시 new 연산자를 붙여 실행한다.
예시:
function User(name) { // this = {}; 빈 객체가 암시적으로 만들어진다. this.name = name; this.isAdmin = false; // return this; this가 암시적으로 반환된다. } let user = new User("보라"); alert(user.name); // 보라 alert(user.isAdmin); // false
new User()을 써서 함수를 실행하면 아래와 같은 알고리즘이 동작한다.
1. 암시적으로 빈 객체를 만들어서 this에 할당한다.
2. 함수 본문을 실행하면서 this에 새로운 프로퍼티를 추가하면서 this를 수정한다.
3. 암시적으로 this를 반환한다.
생성자와 return 문
생성자 함수에는 보통 return문이 없다. 반환해야 할 모든 정보가 this에 저장되고, this는 자동으로 반환되기 때문이다.
하지만 return 문이 있다면 다음과 같은 규칙이 적용된다.
1. 객체를 return한다면 this 대신 객체가 반환된다.
2. 원시타입을 return한다면 원래대로 this가 반환된다.
생성자 내 메서드
function User(name) { this.name = name; this.sayHi = function() { alert( "제 이름은 " + this.name + "입니다." ); }; } let bora = new User("이보라"); bora.sayHi(); // 내 이름은 이보라입니다. /* bora = { name: "이보라", sayHi: function() { ... } } */
sayHi 메서드도 프로퍼티처럼 this.를 붙여서 더해줄 수 있고 sayHi 내부에서도 this.name으로 this 내부의 name 프로퍼티를 가져올 수 있다.
문제
1. 계산기 만들기
아래와 같은 세 개의 메서드를 가진 생성자 함수, Calculator를 만들어보세요.
- read() – prompt 함수를 이용해 사용자로부터 값 두 개를 받고, 이를 객체 프로퍼티에 저장합니다.
- sum() – 프로퍼티에 저장된 값 두 개를 더한 후 반환합니다.
- mul() – 프로퍼티에 저장된 값 두 개를 곱한 후 반환합니다.
function Calculator() { this.a, this.b, this.read = function() { this.a = +prompt('값 입력','') || '0'; this.b = +prompt('값 입력','') || '0'; }; this.sum = function() { return this.a + this.b; }; this.mul = function() { return this.a * this.b; }; } let calculator = new Calculator(); calculator.read(); alert( "Sum = " + calculator.sum()); alert( "Mul = " + calculator.mul());
2. 누산기 만들기
생성자 함수 Accumulator(startingValue)를 만들어 보세요.
Accumulator(startingValue)를 이용해 만드는 객체는 아래와 같은 요건을 충족해야 합니다.
- 프로퍼티 value에 현재 값(current value)을 저장합니다. 최초 호출 시엔 생성자 함수의 인수, startingValue에서 시작값(starting value)을 받아옵니다.
- 메서드 read()에선 prompt 함수를 사용해 사용자로부터 숫자를 받아오고, 받은 숫자를 value에 더해줍니다.
프로퍼티 value엔 startingValue와 사용자가 입력한 모든 값의 총합이 더해져 저장됩니다.
function Accumulator(startingValue) { this.value = startingValue; this.read = function() { this.a = +prompt('숫자 입력',''); this.value +=this.a; }; } let accumulator = new Accumulator(1); accumulator.read(); accumulator.read(); alert(accumulator.value);
'Javascript' 카테고리의 다른 글
Javascript30 - shift누른 채로 체크 박스 클릭시 그사이의 체크박스 전부 체크되는 미니플젝 (0) 2021.07.04 객체 - 메서드와 this (0) 2021.07.03 객체 - 참조에 의한 객체 복사 (0) 2021.07.03 객체 - 객체 (0) 2021.07.03 코드 품질 - 테스트 자동화와 Mocha (0) 2021.07.02