작성
·
1K
0
안녕하세요!
클래스 안에서 메소드로 쓸 때는 화살표함수도 프로토타입이 존재하는거같아요.
그리고 클래스 안에서 화살표함수를 사용하면 인스턴스를 생성할때, 메소드를 상속받지 않고 새로운 메소드를 가지고있는 것 같습니다.
클래스 안에서는 화살표함수보다 선언적 함수를 쓰는게 성능상 유리할까요?
답변 2
1
- 클래스 안에서 화살표함수를 쓰면 인스턴스의 prototype에 메서드가 적용되는게 아니라 인스턴스 각각의 property로 할당됩니다. 이는 '화살표함수'라서가 아니라, 선언 방식 자체가 public instance field로 인식되어서 그렇습니다.
calss fields - public instance fields
- "클래스 안에서 메소드로 쓸 때는 화살표함수도 프로토타입이 존재한다"는 무얼 근거로 그렇게 말씀하시는 건지 모르겠어요.
- 클래스 안에서 '선언적 함수'를 사용한다는건 어떤 말씀이실까요? 혹시 class에서 원래부터 그렇게 선언하도록 규정한 메서드 표기법을 말씀하시는거라면, 그렇기도 하고 안그렇기도 합니다. 두가지 측면에서 고려해야 하는데요,
1) 인스턴스 개수가 매우 많은 상황에서 메서드 내부의 동작이 모두 동일하다면, 당연히 정상적인 메서드 표기 방식이 우월합니다. 전체 메모리상에 단 하나만 탑재되어 있고 그걸 모든 인스턴스들이 가져다 쓸 뿐이니 메모리 용량 면에서 훨씬 효율적이죠.
2) 메서드 내부에서 인스턴스별로 제각각 다르게 동작해야 하는 상황이라면, 화살표함수가 도움이 될 수 있습니다. 예컨대 리액트를 class로 작성하던 시절에 리스트의 각 아이템을 클릭할 때 해당 아이템의 인덱스를 필요로 하는 메서드는 화살표함수로 만드는 편이 유리했습니다. 그 이유는, 첫째, 프로토타입 메서드 하나를 재활용하려면 호출시마다 인덱스를 넘겨줘야 하는데 그러기 위해서 별도의 화살표함수를 만드는 결과를 초래해서 오히려 낭비가 되었기 때문입니다. 둘째, 인스턴스에서 프로토타입 메서드에 접근하기 위해선 프로토타입 체이닝을 1단계 뛰어야 하는 반면, 인스턴스 자신이 들고 있는 메서드는 그럴 필요가 없기 때문에 검색 효율면에서 아주 미세하게나마 이익이 있습니다.
그런데 앞서 예로 말씀드린 '클래스로 작성하던 리액트' 시절의 상황을 제외하고 보면, 그밖의 케이스에 이런걸 고려해야 할 이유를 전혀 느끼지 못하고 있습니다. 즉 클래스 내부에서 "굳이" 화살표함수를 사용해야 할 사례는 거의 찾아보기 어렵습니다.
[[Prototype]]과 prototype은 전혀 다른 별개의 프로퍼티입니다.
[[Prototype]]은 기본적으로 모든 참조형 데이터타입이 들고 있습니다.
prototype은 생성자함수로 호출할 수 있는 함수 및 클래스의 constructor에만 존재합니다.