객체의 프로퍼티를 삭제한다
프로퍼티의 값을 지우는 것이 아니라 프로퍼티 자체를 삭제한다
상속받은 프로퍼티가 아닌 고유 프로퍼티만 지울 수 있다
상속된 것을 지우기 위해서는 해당 프로퍼티가 정의된 곳에서
-> 상속받고있는 모든 객체에 영향을 준다
delete는 삭제 성공, 프로퍼티가 존재하지 않아서 아무 일 없을 때
모두 true를 반환한다
delete 1; // true
delete 연산자는 configurable 속성이 false인 프로퍼티를 지우지 않는다
엄격모드에서 변경할 수 없는 속성을 지우려하면 TypeError 발생
delete Object.prototype; // Object.prototype는 변경할 수 없으므로 지울 수 없음
var x = 1;
delete x; // SyntaxError - this.로 한정하지 않으면 에러
delete this.x; // 전역 객체의 프로퍼티는 지울 수 없다
var o = { x: 1 };
'x' in o; // true
o.x !== undefined; // true - 프로퍼티의 값이 undefined가 아니라면 in 연산자 보다 효과적
'toString' in o; // true - 상속 받은 프로퍼티도 검삭
o.hasOwnProperty('toString') // false - 고유 프로퍼티만 검사
getter, setter
getter 메소드만 있으면 읽기 전용
setter 메소드만 있으면 쓰기 전용 (데이터 프로퍼티는 쓰기 전용을 만들 수 없다 - 데이터 프로퍼티: 접근자 프로퍼티를 갖지 않는 객체의 프로퍼티 인듯..)
객체 리터럴로 간단히 접근자 프로퍼티 생성
// 함수 정의 function 대신 get, set을 사용한다
const p = {
x: 1,
y: 2,
get getP() {
return `x = ${this.x}, y = ${this.y}`;
},
set setP(value) {
this.x += value;
this.y += value * 2;
},
};
console.log(p.getP); // x = 1, y = 2
p.setP = 1;
console.log(p.getP); // x = 2, y = 4
const random = {
get randInt10() {
return Math.floor(Math.random() * 10);
},
};
console.log(random.randInt10);