import Order from './Order';
function acceptOrder(menu: string[]) {
const order = Order.generate(menu);
return order;
}
const orderA = acceptOrder(['pizza', 'pasta']);
const orderB = acceptOrder(['coffe']);
console.log(orderA);
console.log(orderB);
// { id: 315, menu: [ 'coffe' ], generate: [Function: generate] }
// { id: 315, menu: [ 'coffe' ], generate: [Function: generate] }
Object.create() 없이 선언하면 Object가 깊은 복사가 되지 않는다.
import Order from './Order';
function acceptOrder(menu: string[]) {
const order = Object.create(Order);
order.generate(menu);
return order;
}
const orderA = acceptOrder(['pizza', 'pasta']);
const orderB = acceptOrder(['coffe']);
console.log(orderA);
console.log(orderB);
// { id: 578, menu: [ 'pizza', 'pasta' ] }
// { id: 296, menu: [ 'coffe' ] }
잘 복제되어 Instance화된 것을 확인할 수 있다.
Class는 사용할 때 시각적으로 복잡해보이는 경향이 있어서 사용하고 싶지 않은데, 클래스처럼 인스턴스와 같이 써보고 싶었다. 대신 Object를 클래스처럼 사용할 수 있는 방법이 없을까 고민하다가 Object.create()라는 함수라는 것이 있다는 것을 알게 되었다.
이렇게 했을때 블루프린트의 개념에 가까운 Class에 비해 Object를 선언해버리면 메모리를 더 사용하지 않을까하는 궁금증이 생겼다.
웹에선 답변을 찾을 수 없어서 ChatGPT에게 질문한 결과 클래스도 Heap Memory에 올라간다는 것을 확인할 수 있었다. 블루프린트라는 것은 딱 개념만 그렇다라는 것이고 Instance 든, Class 든 전부 메모리에 올라가는 모양이다. 생각해보니 당연한 것 같다.
화살표 함수는 this를 못받는다는 사실을 알게 되었다. 그럼 object 에서는 this를 사용할 수 없는 걸까? 싶었는데 그렇지는 않고 function 을 명시하면 해결이 되었다.
const obj = {
number: 42,
myFunc: function() {
console.log(this.number);
}
};
obj.myFunc();
// Output: 42
이 this는 꼭 한번 따로 공부 해서 정리해야 할 주제이다. 꼭 한번 정리해보자!
https://velog.io/@ragnarok_code/EventEmitter%EB%9E%80
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
myEmitter.on('myevent', () => console.log('handler1: myevent was fired!'));
myEmitter.on('myevent', () => console.log('handler2: myevent was fired!'));
myEmitter.on('myevent', () => console.log('handler3: myevent was fired!'));
myEmitter.emit('myevent');
console.log('I am the last log line');
events
는 이벤트를 생성하고 이벤트를 출력할 수 있는 nodejs 내장 모듈이다. 이걸 Event Emitter라고도 하는데, ~.on
을 선언하는 순간 이벤트로 실행될 함수들을 저장하고 .emit
하면 이벤트를 실행한다. 생각해보니 custom event 와 유사한 것 같다. 내가 custom event에 실행될 함수를 지정하면 내가 지정한 시점에 그 이벤트를 emit하는 과정이 유사하다.
CallStack에서 실행된 비동기 함수는 Web API를 호출하고, Web API는 콜백 함수를 태스크 큐에 넣는다. 콜 스택이 비어있을 때 콜 스택에 콜백 함수를 넣어주는 것이 이벤트 루프이다.
node js의 jvm 같은 친구이다. 노드는 싱글스레드이다. 메인스레드가 이벤트 루프로 동작한다. 몇 개의 스레드를 워커스레드로 만들어서 필요할 때만 일을 시킨다. 단일스레드인데 멀티스레드처럼 동작하는 이유는 람다나 클로저로 콜백을 넘어주고, 내부 큐에 저장을 해놓고 루프가 돌면서 실행을 하는 구조이기 때문에 가능하다. 굉장히 효율적으로 되어 있음.