코드스쿼드 코코아과정 4주차 TIL - Part2
<초반 진행상황>
<새롭게 알게된 점>
얕은 복사 vs. 깊은복사
- 얕은 복사:
사본을 만들어내지 않고 원본을 참조한다. 사본을 변경하면 원본도 함께 변경된다.
- 깊은 복사:
완벽하게 원본과 사본이 분리되어 복사된다. 사본을 변경해도 원본은 유지된다.
JSON.parse(JSON.stringify())
로 깊은 복사는 가능하지만 gettser/setter 등 JSON 으로 변경할 수 없는 프로퍼티는 무시한다. 배열도 깊은 복사가 가능하지만 배열 관련 함수는 사용 불가능하다.
//얕은 복사
const a = [1, 2, 3, 4, 5, 6];
let b = a;
b.pop();
console.log(b); //[1, 2, 3, 4, 5]
console.log(a); //[1, 2, 3, 4, 5]
//깊은 복사
const c = [1, 2, 3, 4, 5, 6];
let d = c;
d.pop();
console.log(d); //[1, 2, 3, 4, 5]
console.log(c); //[1, 2, 3, 4, 5, 6]
this로 지정해주고자 하는 객체가 정확히 무엇인지 꼼꼼하게 볼 것!
class Controller {
//(생략)
addButtonEvent() {
const button = document.querySelector(".check_post_box");
button.addEventListener("click", this.view.showPostBoxData.bind(this)); 📌📌📌
}
}
class View {
//(생략)
showPostBoxData() {
this.colorTownBorderRed(); //에러 발생❗️❗️Error: colorTownBorderRed is not a function
}
colorTownBorderRed(){
}
}
const map = new Map;
const view = new View;
const controlMap = new Controller(map, view);
controlMap.init();
Controller
클래스의 메소드에서 View
클래스의 메소드인 showPostBoxData()
를 호출했다.
이 때 this.view.showPostBoxData.bind(this)
로 전달하면 this값이 view
가 될 것이라고 생각했지만 에러가 발생했다.
(당연한 결과지만) this.view.showPostBoxData.bind(this)
로 실행하면 this는 Controller의 인스턴스인 controlMap
이 된다.
class Controller {
//(생략)
addButtonEvent() {
const button = document.querySelector(".check_post_box");
button.addEventListener("click", this.view.showPostBoxData.bind(this.view)); 📌📌📌
}
}
class View {
//(생략)
showPostBoxData() {
this.colorTownBorderRed(); //정상호출된다 👍
}
colorTownBorderRed(){
}
}
const map = new Map;
const view = new View;
const controlMap = new Controller(map, view);
controlMap.init();
view
를 바인딩 해주기 위해서는 this.view.showPostBoxData.bind(this.view)
로 정정되어야 한다.
controlMap
이 view
를 하위에 가지고 있기 때문!
[{...}, {...}, {...},,,]
로 만들어볼 수 있다.setTimeout
은 재귀호출을 할 수 있다. setTimeout
을 가진 함수를 다시 재귀호출하면 애니메이션 같은 효과를 낼 수도 있다.setTImeout
에 타임을 '0'을 주면 스택이 쌓이지않고 바로 바로 실행할 수가 있다.