loose
이로운 개발하기
loose
전체 방문자
오늘
어제
  • 전체 (205)
    • ☕ Java (24)
    • 📘 Effective Java (9)
    • 🍃 Spring (48)
    • 📖 ORM (9)
    • ☸️ Kubernetes (13)
    • 🐧 Linux (5)
    • 🐋 Docker (5)
    • 🛠️ CI & CD (7)
    • 🕸️ Web (6)
    • 🔗 Distributed System (3)
    • 📜 Js (10)
    • 📈 Database (11)
    • 🗂️ Etc (34)
    • 🧑 Chitchat (11)
    • 📒 문학 (9)
    • 👜 개인 공부 창고 (1)

공지사항

반응형

최근 글

최근 댓글

loose

이로운 개발하기

📜 Js

[JavaScript] 변수에 대한 불변성 정리(const, defineProperty)

2022. 12. 18. 12:32
반응형

Const

 

변수를 불변하게 만들기 위해서 대표적으로 사용되는 것은 const(상수)다.

const name = 'loose';
console.log(name); // loose

하지만 const에 아래와 같이 객체 형태의 값을 넣으면 객체 내부의 속성은 변경이 가능해진다.

const x = {};

x.foo = 'bar';
console.log(x); // {foo : 'bar'}

x.foo = 'bar2';
console.log(x); // {foo : 'bar2'}

x = {}; // 불가능

위와같이 x에 foo라는 속성을 추가하거나 수정하는 것은 가능하다.

하지만 x를 재정의 하는 것은 불가능하다.

 

이것은 자바에서 Final과 같다.

자바에서도 Final을 쓰면 변수를 상수로 만들 수 있지만 Final로 설정된 객체의 내부 속성에 대한 변경까지는 막을 수 없다.

그래서 Constant(상수)는 Read-Only가 아니다라는 점을 알고가야한다.

Constant는 재할당(Reallocation)이 불가능하다라는 측면에서 사용된다.

많은 사람들이 상수를 Read-Only라고 생각하는 오류를 범한다. 

다시 말해서 상수는 Read-Only가 아니다.

그럼 내가 원하는 Read-Only를 적용하고 싶다면 어떻게 할까?

 

Object.freeze()

Object.freeze()를 쓰면 객체 속성에도 Read-Only가 적용된다.

정수형이나 문자형 뿐만 아니라 객체형도 전부 Read-Only를 적용시킬 수 있다.

const x = Object.freeze(['a'])
x.push('b')

Object.seal()

Object.seal()은 객체 속성에 대한 수정은 가능하지만 속성을 확장하는 것은 불가능하다.

var obj = {
	value: 10
};

Object.seal(obj);
obj.value = 20;
console.log(obj.value);

obj.name = "loose"; // 새로 넣는건 불가능
console.log(obj.name)

Object.defineProperty()

const obj = {};

Object.defineProperty(obj, 'a', {
  value: 100,
  writable: false
});

obj.a = 200;
obj.a === 100; // true

위에서 배운 freeze()나 seal()은 전부 defineProperty()라는 메소드를 통해 정의된 메소드라고 봐도된다.

writable을 false로 줘서 freeze()와 같은 설정이 가능하다.

각각의 객체마다 속성을 알고 싶다면 아래의 코드를 사용해서 확인할 수 있다.

Object.getOwnPropertyDescriptors(obj);

 

728x90

'📜 Js' 카테고리의 다른 글

자바스크립트 배우기 좋은 사이트  (0) 2023.01.02
jQuery Template과 jsRender로 만드는 동적 HTML 생성  (0) 2022.12.18
[JavaScript] 프로토타입 쓰는 이유, 목적 그리고 사용법  (0) 2022.12.18
React를 이용한 다른 색깔 찾기 게임 Clone Coding  (0) 2022.02.05
alert 위치 모를때 위치 찾는 법  (0) 2022.01.20
    '📜 Js' 카테고리의 다른 글
    • 자바스크립트 배우기 좋은 사이트
    • jQuery Template과 jsRender로 만드는 동적 HTML 생성
    • [JavaScript] 프로토타입 쓰는 이유, 목적 그리고 사용법
    • React를 이용한 다른 색깔 찾기 게임 Clone Coding
    loose
    loose
    불만하는 사람은 90명, 해결하는 사람은 9명, 리드하는 사람은 1명 음악과 낭만을 좋아합니다.
    hELLO. 티스토리 스킨을 소개합니다.
    제일 위로

    티스토리툴바