내부 슬롯과 내부 메서드
[[Prototype]]
프로퍼티 어트리뷰트
Object.getOwnPropertyDescriptor(obj,"key")
로 확인 가능데이터 프로퍼티
일반적, 인스턴스나 메서드
Property Attribute | Description |
---|---|
[[Value]] | 프로퍼티 값에 접근시 반환 & 변경 시 재할당되는 속성. |
[[Writable]] | 프로퍼티 값의 변경 가능 경우를 나타내는 속성. (false라면 변경 불가능 ) |
[[Enumerable]] | 프로퍼티의 열거 가능 여부를 나타내는 속성. (false 라면 Object.keys() 등으로 열거불가) |
[[Configurable]] | 프로퍼티의 재정의 가능 여부를 나타내는 속성 (false 라면 다시 정의가 불가능) |
접근자 프로퍼티
자체적인 값이 없고, 접근자 함수로만 구성되어 있음
| Property Attribute | Description |
| :----------------: | :-----------------------------------------------------------------------------------: |
| [[Get]] | getter 함수를 호출 -> 프로퍼티 값을 반환 |
| [[Set]] | setter 함수를 호출 -> 프로퍼티 값으로 저장 |
| [[Enumerable]] | 프로퍼티의 열거 가능 여부를 나타내는 속성. (false 라면 Object.keys() 등으로 열거불가) |
| [[Configurable]] | 프로퍼티의 재정의 가능 여부를 나타내는 속성 (false 라면 다시 정의가 불가능) |
Ex)
const date = {
year : 2021, month : 12, day : 17 ,
get fullDate() {return `${this.year}-${this.month}-${this.day}`;},
set fullDate(date) {[this.year,this.month,this.day]= date.split("-").map(elem => elem * 1);}
};
프로퍼티 어트리뷰트 확인
Object.getOwnPropertyDescriptor(obj,"key")
Object.getOwnPropertyDescriptors(obj)
프로퍼티 정의
Object.defineProperty(obj,key,{ ...atr})
Object.defineProperties(obj,{
key1:{
...atr1
},
key2:{
...atr2
},
...
})
객체 변경 방지
구분 | 메서드 | 추가 | 삭제 | 값 읽기 | 값 쓰기 | 속성 재정의 |
---|---|---|---|---|---|---|
객체 확장금지 | Object.preventExtensions | X | O | O | O | O |
객체 밀봉 | Object.seal | X | X | O | O | X |
객체 동결 | Object.freeze | X | X | O | X | X |
각각 Object,isExtensible, Object.isSealed, Object.isFrozen
으로 확인 가능
불변객체
객체 리터럴을 사용한 생성 방식의 문제점
생성자 함수를 사용한 생성 방식의 장점
this : 자기 참조 변수
함수 객체 프로퍼티 내부 메서드
[[Call]]: 일반 함수로써 호출되면 실행된다.
[[Construnctor]] : 생성자 함수로써 호출될 때 실행된다.
constructor & non-constructor
fun(args) { ...}
) 은 [[Constructor]] 메서드가 없는 non-constructor이다.undefined
를 가리킨다.)function Person(age) {
if (!new.target) {
return new Person(age);
}
this.age = age;
}
this instnace of Person
을 이용하여 생성자 함수인지 확인ㄴ빌트인 생성자 함수