Front-End/JavaScript
[Javascript] 객체, 생성자 함수 숙지사항
sihyeong
2022. 10. 26. 23:11
객체
- 객체는 키와 값으로 구성된 프로퍼티의 집합이다.
- 당연히 null인 객체의 프로퍼티 참조 시 에러발생
for-in
- 객체의 문자열 키를 순회하기 위한 문법이다.
- 순서보장 x + 추가적인 프로퍼티까지 순회하기 때문에 배열에 사용 부적합
- 객체 순회 적합
for-of
- 위의 문제점 때문에 배열 순회 시 맞춤형 문법 만들어짐
- 순서보장 o + 배열 요소들만 순회함
- 배열 순회 적합
얕은 복사
- 객체의 복사는 참조이다.
Object.assign(target, ...source)
- 얕은복사는 Object.assign(target, ... source)를 이용해 복사 가능
const original = {name: '철수', age: 12};
const clone = Object.assign({}, original);
clone.name = '영희'
console.log(original) // {name: '철수', age: 12}
console.log(clone); // {name: '영희', age: 12}
- 다만, IE는 지원 x라는 점 + 객체내부의 객체(객체 프로퍼티로의 객체)는 그대로 참조된 상태라는게 문제다.
ES6 Spread Operator
- 마찬가지로 얕은 복사, 깔끔한 코드가 장점
const original = {name: '철수', age: 12};
const clone = { ...original};
clone.name = '영희'
console.log(original) // {name: '철수', age: 12}
console.log(clone); // {name: '영희', age: 12}
- Object.assign()과 마찬가지로 얕은복사만을 지원, 객체내부의 객체는 그대로 참조된 상태
깊은 복사
- JSON 메서드를 이용하는 방법과 외부 라이브러리 활용 방법이 있다.
- JSON 메서드는 객체 -> JSON스트링 -> 객체 변환을 통해 깊은 복사를 한다.
const original = {profile: {name:'철수', age:12}, grade: 'A'};
const clone = JSON.parse(JSON.stringify(original));
clone.profile.name = '영희';
clone.grade = 'B';
console.log(original) // {profile: {name: '철수', age: 12}, grade: 'A'}
console.log(clone); // {profile: {name: '영희', age: 12}, grade: 'B'}
- 이 방법은 복잡한 객체의 처리 속도가 느리다는 점이 있다.
StructuredClone
- structuredClone(value);로 깊은 복사 가능
- 다만 Function객체, DOM node, 몇몇 파라미터들에선 사용 제한이 있다.
- 완벽히 모든 브라우저에서 이 기능을 제공하는 것이 아니다.
프로퍼티
- 프로퍼티의 이름이 유효한 자바스크립트 이름이 아니거나 예약어라면
- 프로퍼티 값은 대괄호 표기법으로 읽어야 한다.
- -는 올 수 없으나 프로퍼티 값으로 사용했고, 이를 대괄호 표기법으로 읽는 모습
student['t-t'] = 1;
- c++의 map처럼 객체가 소유하고 있지 않은 프로퍼티 키에 값을 할당하면 주어진 키와 값으로 프로퍼티 생성해서 객체에 추가함
- delete person.gender; 처럼 delete를 이용해 객체의 프로퍼티 삭제 가능
생성자 함수
- 생성자 함수 이름은 일반적으로 대문자로 시작함
- this에 연결되어 있는 프로퍼티와 메소드는 public 속성을 가지고
- 생성자 함수 내에 선언된 일반 변수는 private 속성을 갖는다.
function Student(name, age){
this.name = name; // public
this.age = age; // public
var p = 0; // private
this.study = ()=>{ // public
console.log('공부')
}
}