1 minute read

  • 프로토타입 상속

    • 프로토타입

      • 다른 객체를 참조하는 경우의 참조 대상

      • 프로토타입 상속이란 객체가 어떤 객체를 프로토타입으로 설정해서 프로퍼티, 메서드를 상속받는 경우

      • 대상 객체에서 프로퍼티 읽거나 메서드 호출 시 해당하는 것이 없을 경우 프로토타입으로 거슬러 올라가서 찾음

      • 상속 받은 메서드의 this는 프로토타입이 설정되는 것이 아닌 호출한 객체

    • [[Prototype]]

      • 모든 객체에 존재

      • null 이나 다른 객체에 대한 참조값이 됨

      • 참조하는 객체를 프로토타입

      • proto : [[Prototype]] setter 나 getter 로 최근데 잘 안 쓰임

    • for..in

      • 객체 자체에서 정의한 프로퍼티와 프로토타입까지 전부 순회함
    • for..in 외 메서드

      • 여러 메서드 존재

      • 대부분 객체 자체에서 정의된 프로퍼티만 순회

  • 함수의 prototype 프로퍼티

    • 객체 생성자 함수

      • 호출 시 새로운 객체의 [[prototype]] 설정하는 기능

      • 일반 객체에서는 이뤄지지 않음

      • prototype 프로퍼티

        • 일반 프로퍼티

        • 생성자 호출 시 만들어짐

        • 값은 객체나 null만 가능하며 다른 값은 무시됨

        • constructor 프로퍼티

          • 모든 함수가 가지며 기본 값으로 가짐

          • 기본형에선 함수 자기 자신 가리킴

          • 호출 시 객체의 프로퍼티에도 있으며 생성자 함수 가리킴

          • JS 에서는 보장해주지 않아서 prototype 설정 시 consturctor 따로 유지 작업 해줘야 함

  • 네이티브 프로토타입

    • 모든 내장 객체의 메서드는 해당 내장 생성자 함수의 프로토타입에 저장됨

    • 객체 자체엔 데이터만 저장됨

    • 리터럴 문법 또한 생성자 함수와 동일

    • 명세서에서 모든 내장 프로토타입의 상위엔 Object.prototype. 즉 모든 것은 객체를 상속받음

    • 내장 프로토타입

      • 프로토타입 체인 상 중복 메서드 있을 시 체인 상에서 가장 가까운 메서드 사용(프로토타입 알고리즘에 의해 찾고 올라가는 동작에 의함)

      • 수정 가능

      • 메서드 빌리기

        • 프로토타입의 메서드를 빌리는 경우

        • 내장 메서드 대부분이 해당 메서드가 속한 자료형인지 확인하지 않고 프로퍼티만 확인해서 진행하는 알고리즘 이용

        • 지양하며 폴리필 만들 시만.

    • 원시값

      • 래퍼 객체의 프로토타입에 메서드 저장

      • 메서드 호출 시 래퍼 객체로 감싸진 다음 메서드 호출하고 래퍼 객체 바로 삭제

      • undefined, null은 래퍼 객체 없음

      • 래퍼 객체는 보이지 않는 곳에서 생성되며 최적화는 JS 엔진이 담당

  • 프로토타입 메서드와 proto가 없는 객체

    • proto

      • Object.prototype 의 접근자 프로퍼티

      • [[prototype]] 그 자체가 아닌 가져오기 위한 getter/setter

      • 사용자가 키 직접 만들 게 허용 시 proto 에 접근 할 여지 생기며 보안 문제 발생할 수 있음

    • 모던 메서드

      • proto 대신 프로토타입에 접근 할 수 있으며 proto 직접 접근접근 하는 것 방지함

      • proto없게 하여 상속을 받지 않는 객체 생성 가능

      • 객체 프로퍼티 반환하는 메서드들은 객체가 ‘직접’ 소유한 프로퍼티만 반환

      • 지향