JavaScript 객체지향 프로그래밍 객체 상속 패턴

    2018-04-24 09:00:17 작성
    • 생성자 훔치기

      이 패턴의 기본 아이디어는 SubType 생성자 안에서 SuperType 생성자를 호출 하는 것입니다.
      apply()와 call() 메서드를 통해 SubType에서 생성자를 실행할 수 있습니다.

      hasOwnProperty() 매서드로 소유자를 확인할 수 있습니다.

      SuperType으로 매개변수 전달

      생성자 훔치기 패턴은 SuperType으로 매개변수를 전달할 수 있습니다.

      생성자 훔치기 패턴은 생성자패턴과 같은 문제가 발생합니다.
      메서드를 생성자 내부에서만 정의 해야 하며 위의 예제처럼 prototype에 정의하면 프로토타입 상속이 이루어 지는게 아니기 때문에 메서드를 사용할 수 없습니다.
      이러한 문제 때문에 생성자 훔치기 패턴만 단독으로 쓰는 경우는 드뭅니다.

    • 조합상속

      프로토타입 체인과 생성자 훔치기 패턴의 장점만을 조합하는 패턴입니다.
      이렇게 하면 프로토타입에 메서드를 정의하여 재사용할 수 있고,
      각 인스턴스가 고유한 프로퍼티를 가질 수도 있습니다.

      조합상속은 자바스크립에서 가장 자주 쓰는 상속 패턴입니다.
      instanceof 연산자와 isPrototypeOf()메서드에서도 올바른 결과를 반환합니다.

    • 프로토타입 상속

      2006년 더글러스 크록포드는 『자바스크립의 프로토타입 상속』이라는 글을 썻는데 이 글에서 엄격히 정의된 생성자를 쓰지 않고도 상속을 구현하는 방법을 소개했습니다.
      이 방법은 새 객체를 생성할때 사용자정의 객체를 정의할 필요는 없다는 데서 출발합니다.
      크록포드가 소개한 함수는 다음과 같습니다.

      object() 함수는 임시 생성자를 만들어 매개변수로 전달 받은 객체를 생성자의 프로토타입으로 할당한 후, 임시 생성자의 인스턴스를 반환합니다.

      이 방법에서는 다른 객체의 기반이 될 공유객체를 정의하고, 공유객체를 object()함수에 넘긴다음 결과 객체를 적절히 수정하여 사용합니다.
      이 코드는 person객체의 복제본을 만드는 효과가 있습니다.
      ECMA script 5판에서는 이 개념을 공식적으로 허용하여 Object.create() 메서드를 추가했습니다.

      Object.create(proto, propertiesObject)

      이 메서드는 두개의 매개변수를 전달 받습니다.
      proto만 전달하면 위의 예제와 완전히 동일합니다.

      • proto : 새로 만든 객체의 프로토타입이 될 객체
      • propertiesObject : 옵션, 새 객체에 추가할 프로퍼티를 담은 객체

      프로토타입 상속패턴은 다른 객체와 비슷하게 동작하지만 생성자를 따로 만들 필요가 없다는 점에서 유용합니다.
      프로토타입 패턴과 마찬가지로 참조값을 포함하는 프로퍼티들은 모두 그 값을 공유함을 유념하십시오.

    • 기생 상속

      기생 상속이란 개념도 역시 더글라스 크록포드가 만들었습니다.
      기본 아이디어는 상속을 담당할 함수를 만들고, 객체를 확장해서 반환하는 것 입니다

      기생상속을 이용해 객체에 메서드를 추가하면 재사용과 관련된 비효율 문제가 생김을 염두에 두십시오.

    • 기생 조합 상속

      조합상속은 가장 자주쓰는 패턴이지만, 비효율적인 면이 있습니다.
      SuperType 생성자가 항상 두번 호출된다는 점입니다.

      1. SubType의 프로토타입을 생성하기 위해서
      2. SubType의 생성자 내부 call 또는 apply 함수에 의해

      SubType타입의 프로토타입은 상위타입객체의 인스턴스 프로퍼티를 모두 상속하는데
      SubType타입 생성자가 실행되는 순간 이를 모두 덮어쓰므로 별 의미가 없습니다.
      조합상속 예제를 다시 살펴보겠습니다.

      기생 조합 상속의 기본 패턴

      기생 조합 상속은 생성자 훔치기를 통해 프로퍼티 상속을 구현하지만, 메서드 상속에는 프로토타입 체인을 혼용합니다.

      객체 생성 Supertype의 prototype객체를 기반으로 복재 객체를 생성합니다.
      객체 확장 prototype을 덮어쓸때 사라지는 constructor를 subType으로 연결합니다.
      객체 할당 subType의 prototype에 복재객체를 할당합니다.

      기생조합상속은 참조타입에서 가장 효율적인 상속 패러다임으로 평가 받습니다.