TIL: Object.create(), 익명함수와 this, EventEmitter, Event

Snoop So·2023년 2월 9일
0

Object.create()

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

화살표 함수는 this를 못받는다는 사실을 알게 되었다. 그럼 object 에서는 this를 사용할 수 없는 걸까? 싶었는데 그렇지는 않고 function 을 명시하면 해결이 되었다.

const obj = {
  number: 42,
  myFunc: function() {
    console.log(this.number);
  }
};

obj.myFunc();
// Output: 42

https://velog.io/@padoling/JavaScript-%ED%99%94%EC%82%B4%ED%91%9C-%ED%95%A8%EC%88%98%EC%99%80-this-%EB%B0%94%EC%9D%B8%EB%94%A9

이 this는 꼭 한번 따로 공부 해서 정리해야 할 주제이다. 꼭 한번 정리해보자!

EventEmitter

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하는 과정이 유사하다.

Event Loop

CallStack에서 실행된 비동기 함수는 Web API를 호출하고, Web API는 콜백 함수를 태스크 큐에 넣는다. 콜 스택이 비어있을 때 콜 스택에 콜백 함수를 넣어주는 것이 이벤트 루프이다.

Libuv Looper

node js의 jvm 같은 친구이다. 노드는 싱글스레드이다. 메인스레드가 이벤트 루프로 동작한다. 몇 개의 스레드를 워커스레드로 만들어서 필요할 때만 일을 시킨다. 단일스레드인데 멀티스레드처럼 동작하는 이유는 람다나 클로저로 콜백을 넘어주고, 내부 큐에 저장을 해놓고 루프가 돌면서 실행을 하는 구조이기 때문에 가능하다. 굉장히 효율적으로 되어 있음.

0개의 댓글