공부/Java script
[JavaScript] 프로퍼티 어트리뷰트 : 프로퍼티의 세부설정
<오늘부터1일>
2021. 10. 27. 23:09
프로퍼티 어트리뷰트란?
자바스크립트 엔진은 우리가 프로퍼티를 생성하면 자동적으로 프로퍼티 어트리뷰트를 정의한다.
프로퍼티 어트리뷰트란 프로퍼티의 내부의 상태를 나타내는 로직들이다.
프로퍼티 값[Value], 값의 갱신 여부 [Writable], 열거 가능 여부[Enumerable], 재정의가능여부[Configurable]이 있다.
어트리튜브를 확인하는 방법은 Object.getOwnPropertyDescripter 메서드를 사용하면 된다.
참고로 ES8에서 도입된 getOwnPropertyDescripters 메서드는 모든 프로퍼티의 프로퍼티 디스크립터 객체를 반환한다.
1
2
3
4
5
6
|
let person = {
name: 'Lee'
}
//프로퍼티 디스크립터 객체 반환
console.log(Object.getOwnPropertyDescriptor(person, 'name'));
//{ value: 'Lee', writable: true, enumerable: true, configurable: true }
|
cs |
프로퍼티 디스크립터 객체란 프로퍼티 어트리뷰트 정보를 제공하는 객체이다.
데이터 프로퍼티
[[Value]] | 프로퍼티 값에 접근하면 반환되는 값, 값을 변경하면 여기에 값을 재할당한다. 프로퍼티가 없을 경우 프로퍼티를 동적으로 생성하고, 값을 저장한다. |
[[Writable]] | 프로퍼티 값의 변경 가능 여부, 불리언 값이다. 해당 값이 false일 경우 해당 프로퍼티의 값을 변경할 수 없는 읽기 전용 프로퍼티가 됨 |
[[Enumerable]] | 프로퍼티의 열거가능 여부, 불리언 값이다. 해당 값이 false일 경우 해당 프로퍼티는 for ...in Object.keys 메서드 등으로 열거할 수 없다. |
[[Configurable]] | 프로퍼티의 재정의 가능 여부, 불리언 값이다. false일 경우 프로퍼티의 삭제, 값의 변경이 금지된다. 단, Writable이 true일 경우에는 [[Value]]의 변경과 [[Writable]]을 false로 변경하는 것은 허용 |
일반적인 프로퍼티. 키와 값으로 구성된 프로퍼티이다.
접근자 프로퍼티
[[Get]] | 프로퍼티의 값을 읽을 때 호출되는 접근자함수 getter 함수, 결과는 프로퍼티 값으로 반환된다. |
[[Set]] | 프로퍼티의 값을 저장할 때 호출되는 접근자함수 setter 함수, 결과가 프로퍼티 값으로 저장된다. |
[[Enumerable]] | 프로퍼티의 열거가능 여부, 불리언 값이다. 해당 값이 false일 경우 해당 프로퍼티는 for ...in Object.keys 메서드 등으로 열거할 수 없다. |
[[Configurable]] | 프로퍼티의 재정의 가능 여부, 불리언 값이다. false일 경우 프로퍼티의 삭제, 값의 변경이 금지된다. 단, Writable이 true일 경우에는 [[Value]]의 변경과 [[Writable]]을 false로 변경하는 것은 허용 |
접근자 프로퍼티란 자체적으로 값을 갖지 않으며 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 사용하는 접근자 함수로 구성된 프로퍼티이다. getter/setter는 자주 사용되는 접근자함수이다. 아래의 코드는 접근자 프로퍼티를 활용하여 프로퍼티 값을 참조/저장 하는 예시이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
let data = {
//데이터 프로퍼티
name: 'Lee',
age: 20,
//getter 함수는 접근자 프로퍼티
get getData () {
return `${this.name} ${this.age}`;
},
//setter 함수는 접근자 프로퍼티
set setData (item) {
[this.name, this.age] = item
}
}
//데이터 프로퍼티를 통한 프로퍼티 값 참조
console.log(data.name, data.age);
//setter함수 호출, 접근자 프로퍼티를 통한 프로퍼티 값 저장
data.setData = ['Kim', 25];
//getter함수 호출, 접근자 프로퍼티를 통한 프로퍼티 값 참조
console.log(data.getData);
//data 객체의 데이터 프로퍼티의 프로퍼티 어트리뷰트
let dataProperty = Object.getOwnPropertyDescriptor(data, 'name');
console.log(dataProperty);
//{ value: 'Kim', writable: true, enumerable: true, configurable: true }
//data 객체의 접근자 프로퍼티의 프로퍼티 어트리뷰트
let accessorProperty = Object.getOwnPropertyDescriptor(data, 'getData');
console.log(accessorProperty);
//{get: [Function: get getData],set: undefined,enumerable: true,configurable: true}
//데이터 프로퍼티/ 접근자 프로퍼티의 어트리뷰트가 다른 것을 알 수 있다.
|
cs |