41기 개발자과정

20211007 객체 생성자 함수

segment 2021. 10. 7. 17:29

객체 생성자 함수

var 혹은 let 으로 선언된 변수 혹은 내부함수는 객체화 후 외부에서 접근이 불가능하다.

- this 키워드로 선언된 변수는 외부에서 접근 가능하다. 

- new 연산자를 활용하여 함수를 객체화를 하는 방식
- this 키워드로 선언된 변수 혹은 메서드가 존재한다.
- 확장이 가능하다.

- 객체생성자함수는 함수명 표기시 파스칼표기법으로 표기한다.

 

기본형 : 

function 함수명 (매개변수1, 매개변수2){
	this.속성명 = 값;
    this.함수명 = function(){
    		<!-- 코드  -->
    	}
}
var 참조변수(인스턴스 네임) = new 함수명();

 

 

1. 함수 선언 후 new 연산자로 객체화 해보기

- myFn과 myFn2는 다른 주소값을 가지고있다.

<script type="text/javascript">
	//1. 함수선언
    function MyFn(){
		}
	
    //2. 함수를 객체화 - 객체형태로 변환
    	var myFn = new MyFn();
		console.log(myFn);
		
		var myFn2 = new MyFn();
		console.log(myFn);
</script>

<- 결과

 

 

 

2. 내부변수선언 this와 var 키워드의 차이점 

- 변수명의 이름이 같더라도 서로 다른 변수이다.- this키워드로 선언된 변수를 내부에서 접근할 경우
this 키워드로 선언된 변수 혹은 메서드는 this 키워드 활용하여 접근한다.

function MyFn2(){
			var userName = '홍길동'; //내부변수
			this.userName = '이순신'; //외부에서 접근이 가능한 변수
		}
var myFn3 = new MyFn2();

객체화 되었으므로 멤버에 접근이 가능하다.

즉 this 키워드로 선언된 내부의 변수 혹은 메서드 외부에서 접근할 수 있는 멤버로 변환된다.

console.log(myFn3);

<- 결과

 

console.log(myFn3.userName);

<-결과 

 

 

3. 접근 불가능한 내부변수(지역변수) 메서드 활용하여 접근하기

function MyFn3(){
			//정보은닉(데이터 보호) 가능하다.
			var userName; //var 키워드로 선언된 변수는 외부에서 접근 불가능하다. 
			
			this.userName;//속성, 필드, 프로퍼티 (!!)
			
			//this 키워드 활용하여 변수선언하고 익명함수 대입할 경우 외부에서 접근 가능한 메서드이다.
			this.setUserName = function(name){
				//지역변수는 this 키워드 없이 내부에서 접근 가능
				userName = name;
				//this 키워드로 선언된 변수는 this 키워드 활용하여 접근한다.
				this.userName = name;
			}
			this.getUserName = function(){
				return userName;
			}
		}
var myFn4 = new MyFn3();

 

1)

console.log(myFn4);

<- 결과 

 

2)

myFn4.setUserName('유관순');
console.log(myFn4.getUserName());

결과 :  유관순

 

3)

this.userName  = name 으로 지정 후

this.userName 에  저장된 값을 출력했다. 

console.log(myFn4.userName);

결과 : 유관순

 

 

3-1. 객체 생성자 함수를 개체화하지 않고 실행해보기.

- 일반 함수처럼 함수를 실행할 경우 return 표기 없으므로 undefined 결괏값이 나온다.
즉 new 연산자가 없을 경우 객체화 되지 않고 일반함수실행처리 실행된다.

var myFn5 = MyFn3();
console.log(myFn5);

결과 :  undefined

 

함수 선언시

객체 생성자 함수 -> 객체화시 멤버을 생성해야 하므로 this 키워드 활용
일반 함수  -> 객체화가 아닌 함수 실행이므로 멤버생성에 관련된 this 키워드 불필요

객체 생성자 함수 혹은 일반함수 활용 용도를 파악하고 내부 구조를 잡아사용 할 것.

 

 4. 객체화시 인자 받아 객체화하기

function MyFn4(name){
			this.userName = name;
		}
		//객체회시에 인수를 넣어 객체화 할 수 있다.
		var myFn6  = new MyFn4('홍길동');
		console.log(myFn6);

<- 결과

 

5. 객체와 객체생성자 함수 차이

1)

동일한 객체 구조를 갖도록 하기 위해서는 구조 전체 복사해서 사용한다.
구조 복사 후 데이타 수정

var user01 = {
				userName : '홍길동',
				userAge : 20
		}
		var user02 = {
				userName : '이순신',
				userAge : 30
		}
		var user03 = {
				userName : '고길동',
				userAge : 25
		}
		console.log(user01, user02, user03);

 

2)

객체 생성자 함수를 개체화했을 경우 동일한 구조의 다른 데이타를 갖도록 할 수 있다.
또한 정보 은닉이 가능하다.

function UserInfo(name, age){
			this.userName = name;
			this.userAge = age;
		}
		var user04 = new UserInfo('홍길동', 20);
		var user05 = new UserInfo('이순신', 30);
		var user06 = new UserInfo('고길동', 25);
		//객체 생성자 함수를 개체화했을 경우 동일한 구조의 다른 데이타를 갖도록 할 수 있다.
		//또한 정보 은닉이 가능하다.
		console.log(user04, user05, user06);

1. 객체 생성자 함수 실습

MemberInfo 라는 객체 생성자 함수는 아래 구조의 회원의 정보를 담아야 한다.
또한 회원 정보는 직접적으로 프로퍼티에 접근이 불가능하며 메서드를 통해서 접근과 수정이 가능해야한다.
아래의 구조를 확인하고 MemberInfo 를 완성하여라.
구조 : 이름, 나이, 성별, 전화번호

<script type="text/javascript">
	function MemberInfo(name, age, gender, phone){
		//객체화시 외부 접근이 불가능.
		var userName;
		var userAge;
		var userGender;
		var userPhone;
		
		//this 키워드는 외부 접근이 가능.
		this.setUserName = function(name){
			UserName = name;
		}
		this.getUserName = function(){
			return UserName;
		}
		this.setuserAge = function(age){
			userAge = age;
		}
		this.getuserAge = function(){
			return userAge;
		}
		this.setuserGender = function(gender){
			userAge = gender;
		}
		this.getuserGender = function(){
			return userGender;
		}
		this.setuserPhone = function(phone){
			userAge = gender;
		}
		this.getuserPhone = function(){
			return userPhone;
		}
	}

	</script>

 

2. 객체 생성자 함수 실습

GuGu 라는 생성자 함수가 있다. 이 함수는 객체화시 숫자형 인수 1개를 받아 객체화가 되며, 
print라는 메서드를 실행시 객체화시 받은 구구단이 출력되고 
sum이라는 메서드를 실행시 개체화시 받은 숫자의 합산값을 리턴한다. 
위 설명대로 생성자 함수를 구현하고 print 메서드와 sum 메서드를 실행하여라.

 

<script type="text/javascript">
	function GuGu(n){
		this.print = function(){
			for(var i=1; i<10; i++){
				console.log(n + 'x' + i +'=' + (n * i));
			}
		}
		this.sum = function(){
			var sum = 0;
			for(var i=1; i<10; i++){
				sum+=i*n;
			}
			return sum;
		}
	}
	var gugu = new GuGu(5);
	gugu.print();
	console.log(gugu.print);
	var sum = gugu.sum();
	console.log(sum);

	</script>