프로그래밍/JS

6장-1) 객체 지향 프로그래밍 - 객체에 대한 이해

소복 2015. 11. 23. 00:00

OOP는 일반적으로 클래스를 통해 같은 프로퍼티와 메서드를 가지는 객체를 여러 개 만든다는 특징이 있다.

하지만 ECMAScript에는 클래스라는 개념이 없으며 ECMAScript의 객체는 다른 객체 지향 언어와 다르다.

ECMAScript의 객체는 이름-값 쌍의 순서없는 그룹이며 각 값은 데이터나 함수가 될 수 있다.


6.1 객체에 대한 이해

객체 리터럴 표기법

var person = {

name: "sovovy",

sayName: function(){

alert(this.name);

}

}


6.1.1 프로퍼티 타입 (ECMAScript 5판 기준)

프로퍼티의 특징을 내부적으로만 유효한 속성에 따라 설명한다.

이 속성들은 JS엔진 내부에서 구현한 것으로 정의했다. (따라서 JS에서 직접적으로 접근하는 방법은 없다.)

-데이터 프로퍼티:  데이터 값에 대한 단 하나의 위치를 포함하여 이 위치에서 값을 읽고 쓴다.

네가지 속성

- [[Configurable]] 해당 프로퍼티가 delete를 통해 삭제되거나, 프로퍼티의 속성을 바꾸거나, 접근자 프로퍼티로 변할 수 있음을 나타낸다. (직접 정의한 모든 프로퍼티에서 이 속성은 기본적으로 true이다.)

- [[Enumerable]] for-in루프에서 해당 프로퍼티를 반환함을 나타낸다.  (직접 정의한 모든 프로퍼티에서 이 속성은 기본적으로 true이다.)

- [[Writable]] 프로퍼티의 값을 바꿀 수 있음을 나타낸다. (직접 정의한 모든 프로퍼티에서 이 속성은 기본적으로 true이다.)

- [[Value]] 프로퍼티의 실제 데이터 값을 포함한다. 프로퍼티의 값을 읽는 위치이며 새로운 값을 쓰는 위치이다. (기본 값은 undefined이다.)

-접근자 프로퍼티: 데이터 값이 들어 있지 않고 getter, setter함수로 구성된다. (둘다 꼭 필요한 건 아니다.) 

네가지 속성

- [[Configurable]] 해당 프로퍼티가 delete를 통해 삭제되거나, 프로퍼티의 속성을 바꾸거나, 데이터 프로퍼티로 변할 수 있음을 나타낸다. (직접 정의한 모든 프로퍼티에서 이 속성은 기본적으로 true이다.)

- [[Enumerable]] for-in루프에서 해당 프로퍼티를 반환함을 나타낸다.  (직접 정의한 모든 프로퍼티에서 이 속성은 기본적으로 true이다.)

- [[Get]] 프로퍼티를 읽을 때 호출하는 함수이다. (기본 값은 undefined이다.)

- [[Set]] 프로퍼티를 바꿀 때 호출하는 함수이다. (기본 값은 undefined이다.)

접근자 프로퍼티를 명시적으로 정의할 수 없으며 반드시 Object.defineProperty()를 사용해야 한다.

ex)

var book = {

_year: 2004 , //프로퍼티 이름 앞에 _을 넣으면 객체의 메서드를 통해서만 접근할 것과 객체 외부에서 접근하지 않겠다는 의도를 나타내는 표기법이다.

};

Object.defineProperty(book, "year", {

get: function(){

return this.year + "년";

}

});


6.1.2 다중 프로퍼티 정의

객체의 프로퍼티들을 동시에 수정해야 할 가능성을 위해 5판에서는 Object.defineProperties() 메서드를 제공한다.

ex)  var book = {};   

Object.defineProperties( book, {

_year: {

value: 2004

}

},

{

_year: {

get: {

return this._year + "년";

}

}

}

);


6.1.3 프로퍼티 속성읽기

Object.getOwnPropertyDescryptor() 메서드를 이용하여 원하는 프로퍼티의 서술사 프로퍼티를 읽을 수 있다.

반환 값은 해당 프로퍼티의 성격에 따라 다른데 네가지 속성들을 프로퍼티로 갖는 객체를 반환한다. (데이터 프로퍼티인지, 접근자 프로퍼티인지.)


[출처: 프론트엔드 개발자를 위한 자바스크립트 프로그래밍]