728x90
객체 생성자 함수(Object Constructor Function)
- 함수를 new 연산자를 통하여 객체화 시키는 것
- var, let 키워드로 내부에 변수나 내부함수 선언시 외부에서 접근 불가능 > java의 private과 비슷
- this 키워드로 내부 변수나 함수(메서드) 선언시 외부에서 접근 가능 > java의 public과 비슷
새로 생성된 객체의 값 바꾸기
function MyFn2(){//클래스처럼 생각하기
//객체화된 나 자신의 속성 생성
this.userName = '홍길동';
//객체화된 나 자신의 메서드 생성
this.getUserName = function(){
};
}
var myFnObj = new MyFn2();
myFnObj.userName = '홍길순';
console.log(myFnObj, new MyFn2().userName);
var myFnObj2 = new MyFn2();
myFnObj2.userName = '유관순';
console.log(myFnObj2, new MyFn2().userName);
결과 : |
var(let)와 this의 차이
function MyFn(){//클래스처럼 생각하기
var userName = '이순신';
//객체화된 나 자신의 속성 생성
this.userName = '홍길동';
//객체화된 나 자신의 메서드 생성
this.getUserName = function(){
};
}
var obj = new MyFn();
console.log(obj.userName);
결과 : |
'이순신'은 MyFn()함수의 지역변수로 선언되어 있어 외부에서 접근이 불가능하다.
같은 객체 내에선 지역변수에도 접근할 수 있기 때문에
MyFn() 함수에 익명함수로 선언되어 있는 메서드를 이용하여 호출해야 한다.
9~10번 줄 코드를 아래의 코드로 수정한 뒤 console.log()를 이용하여
getUserName()메서드를 출력하면 '이순신' 결과값을 확인할 수 있다.
this.getUserName = function(){
return userName;
};
console.log(obj3.getUserName());
결과 : |
구조가 같은 객체를 많이 만들어야 할 때
일반 객체 생성 | 객체 생성자 함수로 객체 생성 |
var obj = [ {name: '홍길동', age: 20}, {name: '이순신', age: 20}, {name: '고길동', age: 20}, {name: '유관순', age: 20}, ]; |
function UserInfo(name, age){ this.name = name; this.age = age; } var obj2 = [ new UserInfo('홍길동',20), new UserInfo('이순신',20), new UserInfo('고길동',20), new UserInfo('유관순',20), ]; |
지금은 객체 안의 멤버가 적어 차이가 잘 보이지 않지만
일반 객체 생성시에는 키를 일일이 써줘야 하는 반면,
객체 생성자 함수로 객체 생성시 매개변수 형태로 값만 써주면 된다
더보기
실습1. 아래의 최종 결괏물이 나올 수 있는 객체 생성자 함수를 선언하도록 하여라.
function MyFn(){
}
console.log(new MyFn(), "결괏물-> { userName:'',getUserName:f(){},setUserName:f(name){}}");
풀이
function MyFn(){
this.userName = '';
this.getUserName = function(userName){
return this.userName
}
this.setUserName = function(name){
this.userName = name;
}
}
결과
실습2. 아래의 최종 결괏물이 나올 수 있는 객체 생성자 함수를 선언하도록 하여라.
function ClassInfo(){
}
console.log(new ClassInfo());
//결과 : {ClassNumber:0, setClassNumber:f(n), getClassNumber:f()}
풀이
function ClassInfo(){
this.ClassNumber = 0;
this.setClassNumber = function(n){
this.ClassNumber = n;
}
this.getClassNumber = function(){
return this.ClassNumber;
}
}
결과
실습3. 아래의 객체모형과 똑같은 형태의 객체가 생성될 수 있는 객체 생성자 함수를 선언하고 new 연산자를 활용하여 객체화를 시켜라.
var obj2 ={
userName : '',
userAge : 0,
userAddr : '',
setUserInfo : function(name,age,addr){
this.userName = name;
this.userAge = age;
this.userAddr = addr;
}
}
풀이
function MyObj2(){
this.userName = '';
this.userAge = 0;
this.userAddr = '';
this.setUserInfo = function(name,age,addr){
this.userName = name;
this.userAge = age;
this.userAddr = addr;
}
}
console.log(obj2);
console.log(new MyObj2());
결과
프로토타입(Prototype)
- 프로토타입: 원형 -> 객체 생성자 함수 정의(선언)한 대상
- 원형에 메서드 및 속성을 추가 할 수 있다.
(원형에서 this 키워드로 속성이나 메서드를 추가하지 않고(원형을 건들지 않고) 메서드나 속성을 추가할 수 있다.) - 객체화된 대상에서 프로토타입으로 추가된 메서드나 속성을 사용할 수 있다.
(객체화된 대상 기준으로 프로토타입으로 확장(상속)) - 정의된 객체생성자 함수 기준으로 객체화가 되며,
프로토타입으로 선언된 속성이나 메서드는 객체화된 대상에 내용은 포함하고 있지않다.
허나 사용은 가능하며, 이를 프로토타입에 명시된 속성이나 메서드를 상속했다고 표현할 수 있다. => 메모리 절약 - 구문 : 원형명.prototype.함수명(or속성명) = 값;
console.log(new Array());
Array.prototype.sum = function(){
console.log(this, 'sum 메서드 내부에서 this 출력');
var n = 0;
for(var i=0; i<this.length; i++){
n += this[i];
}
return n;
}
var arr01 = [1,2,3,4,5];
console.log(arr01);
//프로토타입으로 추가된 메서드 실행
var sum = arr01.sum();
console.log(sum, 'sum 메서드 실행 후 결괏값');
'{ "Hello World!" }; > JavaScript/jQuery' 카테고리의 다른 글
js/ 2022년 D-day (0) | 2021.12.31 |
---|---|
js/ 티스토리 스킨 getElement 이용해보기 (0) | 2021.12.26 |
(JavaScript) 객체 (0) | 2021.12.23 |
(JavaScript) 함수 (0) | 2021.12.15 |
(JavaScript) 제어문 - 조건문,선택문,반복문 (0) | 2021.12.15 |