본문 바로가기

web../javascript

자바스크립트 코어 - 객체


#자바스크립트의 Object


자바스크립트의 모든 객체는 Object 클래스를 상속한다. 그러므로 모든 객체에는 공통으로 Object에서 상속받은 프로퍼티와 메서드가 있다.


  < constructor 프로퍼티 >

          자바스크립트에서 모든 객체는 객체를 초기화하는데 사용되는 생성자 함수인 constructor프로퍼티를 지니고 있다.

          예를 들어 Date() 생성자를 사용하여 객체 d를 생성했다면, d.constructor 프로퍼티는 Date 를 가리킨다.

               var d = new Date();

               d.constructor == Date;   //true

          

          instanceof 연산자는 constructor 프로퍼티의 값을 사용한다. 따라서 위의 코드는 

               var d = new Date();

               if( d instanceof Date )   //true

          이다.



  < toString() 메서드 >

          자바스크립트는 객체를 문자열로 변환해야 할 때 항상 이 메서드를 사용한다. 예를 들면, 문자열과 객체를 + 연산자로

          연결하려 할 때, 문자열을 전달인자로 받는 alert() 같은 메서드의 인자로 객체를 전달할 때, toString()메서드가 호출된

          다. 기본적으로 주어지는 toString()메서드는 "[object Object]" 같은 문자열로 평가된다. 필요하다면 toString() 메서드

          를 정의하여사용하도록 하자.



  < toLocaleString() 메서드 >

          객체의 지역화된 문자열 표현을 제공한다. Object 클래스에 의하여 기본으로 제공되는 toLocaleString() 메서드는 그 자

          체로는 어떠한 지역화 작업도 행하지 않는다. 따라서 기본으로 제공되는 ToLocaleString() 메서드가 반환하는 값은 

          toString() 과 같다.



  < valueOf() 메서드 >

          toString() 메서드와 매우 유사하다. 이 메서드는 자바스크립트 객체를 문자열이 아니라 숫자 같은 다른 기본 타입으로

          변환하려 할 때 호출된다. 즉, 객체가 기본 타입 값을 필요로 하는 문맥 안에서 사용 될 때, 자바스크립트는 valueOf()

          메서드를 자동으로 호출한다.



  < hasOwnProperty() 메서드 >

          프로퍼티의 이름을 담는 한 개의 문자열 전달인자를 받아서 객체가 이 프로퍼티를 소유하고 있는지 검사한다.

          프로퍼티가 사아속받은 것이 아니고 객체 안에 지역적으로 정의되어 존재한다면 true를 반환하고 그렇지 않으면

          false 를 반환한다.



  < propertylsEnumerable() 메서드 >

          hasOwnProperty() 메서드와 마찬가지로 프로퍼티의 이름을 담은 문자열 전달인자를 하나 받아서, 이 이름의 프로퍼티

          를 객체가 상속받지 않고 직접 지역적으로 정의 했는지 검사한다, 나아가 이 프로퍼티가 for/in 루프를 사용하여 열거 

          될 수 있는 것인지 검사한다.



  < isPrototypeOf() 메서드 >

          전달인자로 주어진 객체의 프로토타입 객체라면 true 반환, 그렇지 않으면 false 를 반환한다.





# 자바 스크립트 객체를 생성하는 방법


1. 객체 리터널

   var person = {

name : "mkk",

age : "31",

job : "programmer",


getName : function(){

return this.name;

},

setName : function(name){

this.name = name;

}

};


2. new 연산자 이용

var person = new Object();

person.name = "mkk";

person.age = "31";

person.job = "programmer";

person.getName = function(){

return this.name;

};

person.setName = function(name){

this.name = name;

};


3. 임의 형태의 생성자 함수 정의

function person(name, age, job){

this.name = name;

this.age = age;

this.job = job;


this.getName = function(){

return this.name;

}

this.setName = function(name){

this.name = name;

}

}



# 객체 생성 테스트

 1, 2 번 테스트

        

        alert(person.getName());

  person.setName("moon kwang-keun");

  alert(person.getName());


 3번 테스트

        

        var p1 = new person("mkk", "age", "programmer");

  alert( p1.getName() );

  p1.setName("kwang-keun moon");

  alert( p1.getName() );


변수를 선언하기 위해서는 var 키워드를 사용하지만, 객체의 프로퍼티에는 var 키워드를 사용하지 않아도 되며

사실 사용할 수도 없다.


# 프로퍼티 열거하기 for/in


for/in 루프가 열거하는 프로퍼티는 특정한 순서를 따르지 않는다.

또한 for/in 루프는 모든 사용자의 정의 프로퍼티를 열거하지만 미리 정의된 프로퍼티나 메서드들을 열거하지 않는다.

미리 정의된 프로퍼티나 메서드들을 열거하지 않는다..이 말은 자바스크립트 모든 객체는 Object 객체를 상속 받는데 Object 객체로 부터 상속받는 프로퍼티와 메서드는 열거 하지 않는다는 뜻이다.



# 프로퍼티 존재 확인 하기 in


in 연산자를 사용하면 프로퍼티의 존재 여부를 확인할 수 있다.


//객체 o에 프로퍼티 "x"가 있으면 1을 저장한다.

     if( "x" in o ) o.x = 1;



# 프로퍼티 삭제하기 delete


delete person.age;

프로퍼티를 삭제하는 것은 단순히 프로퍼티에 undefined 값을 할당하는것이 아니라, 실제로 객체에서 프로퍼티를 완전히 제거하는 것을 의미한다. 따라서 for/in 루프는 삭제된 프로퍼티를 열거하지 않으며, 삭제된 프로퍼티는 in 연산자로도 찾을 수 없다.
하지만, 
배열에서의 delete 연산자를 사용하면 배열 원소의 값을 undefined 값으로 설정하게 되는 것이다. 배열의 원소 그 자체의 값은 사라지지 않는다. 배열의 원소를 배열에서 완전히 삭제하고 삭제한 배열 원소의 뒤쪽에 위치한 원소들을 앞쪽으로 옮겨서 저장하려면 배열 메서드를 사용해야 한다.