사용자 정의 객체


(1) 기존 방법


1
2
3
4
5
6
7
8
9
10
function makePerson(first, last){
    return {
        first : first,
        last : last    
    }
}
 
function personFullName(person){
    return person.first + ' ' + person.last;
}
cs



> master = makePerson("susan" , "wilson");

> persnFullName (master);


: sunsan wilson


-> 작동은 하지만 어설픈 방법이다. 전역 공간에 관련 함수가 많이 생성되기 때문. 가장 중요한 것은 객체에 함수를 붙여 놓는 것이다.




(2) 객체에 함수 추가


1
2
3
4
5
6
7
8
9
10
function Person(first, last) {
 
    return {
        first : first,
        last : last,
        fullName : function(){
            return this.first + ' ' + this.last;    
        }
    }
}
cs


> master = Person("susan" , "wilson");

> master.fullName()


: sunsan wilson



-> 여기서 this 는 함수 안쪽에 사용되어 현재 객체를 참조한다. 실제 의미하는 바는, 함수를 지정하는 것


> fullName() 


: undefined


-> 그냥 fullName 메소드를 호출하면, this는 전역에 속해 있기 때문에 undefined를 할당한다.




(3) 전역 함수 추가


1
2
3
4
5
6
7
8
9
10
11
12
13
14
function personFullName(){
    return this.first + ' ' + this.last;
}
 
 
function Person(first, last) { 
    return {
        this.first : first,
        this.last : last,
        fullName : function(){
            return this.first + ' ' + this.last;    
        }
    }
}
cs


> master = new Person("susan" , "wilson");


: new라는 키워드가 새로 추가 되었다. new는 this와 연관이 깊다. 새로운 빈 객체를 만든 다음 지정된 함수를 불러 새로운 객체를 this에 설정한다.

 'new'에 의해 불려지도록 디자인 된 함수를 construct 함수라 일컫는다. 



-> 점차 코드가 개선되고 있지만, 안에 있는 fullName에 정의된 함수를 전역에 있는 함수와 공유하는 것이 좀 더 좋은 방법일 것이다.




(4) 전역 함수와 공유


1
2
3
4
5
6
7
8
9
10
11
12
13
function personFullName(){
    return this.first + ' ' + this.last;
}
 
 
function Person(first, last) { 
    return {
        this.first : first,
        this.last : last,
        fullName : personFullName;
        }
    }
}
cs



-> 프로토타입을 추가하여 조금 더 개선이 가능하다. 프로토타입은 인스턴스된 모든 객체에서 공유할 수 있는 객체이다. 

    이것은 찾아보기 체인 (prototype chain 이라 일컫는)의 한 부분을 이룬다. 

    즉, person 객체에 설정되지 않은 속성에 접근을 시도할 때마다 javascript는 prototype에 대신 존재하는 속성이 있는지 없는지 찾아본다.




(5) 프로토타입 설정 


1
2
3
4
5
6
7
8
9
10
11
12
13
Person.Prototype.fullName = function(){
    return this.first + ' ' + this.last;
}
 
 
function Person(first, last) { 
    return {
        this.first : first,
        this.last : last,
        fullName : personFullName;
        }
    }
}
cs



프로토타입은 Javascript의 가장 강력한 도구 중에 하나이다. 프로토 타입을 통해 언제든지 객체의 속성 및 메소드를 추가 할 수 있다는 뜻이된다.





(6) 프로토타입을 통해 기존 객체에 없던 메소드 추가


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Person.Prototype.firstName = function(){
    return this.first;
}
 
Person.Prototype.fullName = function(){
    return this.first + ' ' + this.last;
}
 
 
function Person(first, last) { 
    return {
        this.first : first,
        this.last : last,
        fullName : personFullName;
        }
    }
}
cs



firstName 이라는 property는 Person 객체에 없지만, 프로토타입을 통해 설정할 수 있다.


정의한 객체 이외에 기존 객체에도 prototype을 정의 할 수 있다.





(6) 프로토타입을 통해 Javascript 내부에 정의된 객체에 메소드 추가


1
2
3
4
5
6
7
8
9
String.prototype.checkNum = function(){    
    var str = "";
    
    if(!isNaN(parseInt(str))){
        return true;
    }else{
        return false;
    }
}
cs






(6) Call , Apply 함수


1
2
3
4
function add(x,y){
    var total = x + y;
    return total;    
}
cs


> add.call(null, 2,3,4) ;

 : 5     

> add.apply(null,[2,3,4]);

 : 5


apply를 통해 배열을 인자 값으로 넘길 수 있다. apply와 call의 첫 번째 인자값에 해당하는 null은 역할은?

 : this, 즉 자기 자신을 지칭한다.






(6) Call, Apply의 첫번 째 인자 값의 활용


1
2
3
4
5
6
7
8
9
var writer = {
  message: 'HI',
  write: function() {
    alert(this.message);
  }
};
var writer2 = {
  message: 'HELLO'
};
cs


writer 객체에는 write라는 property가 있고, 함수를 대입했다.


writer.write();                    // HI

writer.write.call(writer2);     //HELLO

'programming > JavaScript' 카테고리의 다른 글

클로져 (Closures), 메모리 누출  (0) 2018.06.09
배열, 함수  (0) 2018.05.26
객체 (Object)  (0) 2018.05.26
데이터 타입, 변수, 연산자  (0) 2018.05.26

+ Recent posts