[[Prototype] 
프로퍼티 어트리뷰트는 내부 상태 값(meta-property)인 내부 슬롯프로퍼티 어트리뷰트에 직접 접근할 수 없다.Object.getOwnPropertyDescriptor 메서드를 사용하면, 프로퍼티 디스크립터를 반환하고, 프로퍼티 어트리뷰트를 간접적으로 확인할 수 있다.
프로퍼티 어트리뷰트를 갖는다.프로퍼티 어트리뷰트를 갖는다.const person = {
firstname: 'Suhyun',
lastName: 'Lim',
// getter 함수
// 접근자 함수로 구성된 접근자 프로퍼티
get fullName() {
return `${this.firstname} ${this.lastName}`
},
// setter 함수
set fullName(name) {
[this.firstName, this.lastName] = name.split(' ')
}
}
// 접근자 프로퍼티를 통한 프로퍼티 값 저장
person.fullName = 'Shelly Lim'
console.log(person.fullName) // Shelly Lim
console.log(Object.getOwnPropertyDescriptor(person, 'firstname'))
// { value: 'Shelly', writable: true, enumerable: true, configurable: true }
console.log(Object.getOwnPropertyDescriptor(person, 'fullName'))
// { get: f, set: f, enumerable: true, congifureable: true }
__proto__vsprototype일반 객체의
__proto__는 접근자 프로퍼티다.
함수 객체의 prototype은 데이터 프로퍼티다.
데이터 프로퍼티
const person = {};
Object.defineProperty(person, 'firstName', {
value: 'Shelly',
writable: true,
enumerable: true,
configurable: true
})
Object.defineProperty(person, 'lastName', {
value: 'Lim',
// 디스크립터 객체의 프로퍼티를 누락시키면 undefined, false가 기본 값이다.
})
console.log(Object.keys(person))
// ['firstName']
// lastName의 enumerable이 false이기 때문에 열거되지 않는다.
person.lastName = 'Kim'
// lastName의 writable이 false이기 때문에 값을 변경할 수 없다.
// error는 발생하지 않고, 무시된다.
delete person.lastName
// lastName의 configurable이 false이기 때문에 프로퍼티를 삭제할 수 없다.
// error는 발생하지 않고, 무시된다.
Object.defineProperty(person, 'lastName', {
value: 'Lim',
enumerable: true
})
// lastName의 configurable이 false이기 때문에 프로퍼티 어트리뷰트를 재정의할 수 없다.
// error가 발생한다.
접근자 프로퍼티
const person = {};
Object.defineProperty(person, 'firstName', {
value: 'Shelly',
writable: true,
enumerable: true,
configurable: true
})
Object.defineProperty(person, 'lastName', {
value: 'Lim',
// 디스크립터 객체의 프로퍼티를 누락시키면 undefined, false가 기본 값이다.
})
Object.defineProperty(person, 'fullName', {
get() {
return `${this.firstname} ${this.lastName}`
},
set(name) {
[this.firstName, this.lastName] = name.split(' ')
},
enumerable: true,
configurable: true
})
person.fullName = 'Suhyun Lee'
console.log(person)
// { firstName: 'Suhyun' , lastname: 'Lee' }
// lastName의 writable이 false여도, setter를 사용하면 변경할 수 있다.