ES6 Class는 단지 prototype 상속의 문법설탕일 뿐인가?

2016년도 포스팅인데요.
최근에 @thomasJang 님과 static property 관련해서 잠깐 토론을 했어요.
static method는 표준이고 static property는 state-2인것, TS에서 static property를 표현하는 방법 등을 이야기했거든요.
그러고 나니깐 관성적으로 사용하는 ES6의 Class 스펙에 대해서 궁금해져서 찾아봤습니다.
사실 옛날에 봤던 포스팅인데 그때는 ES6에 대해 잘 알지 못할때라 깊게 이해하지 못했는데, 지금 다시 보니 좋은 내용이라 공유해봅니다.

2개의 좋아요

한가지 궁금한 점이 있는데 위의 글에서 상속을 아래와 같이 구현해 놓았더군요.

var inherit = (function() {
  function F(){ }
  return function(C, P) {
    F.prototype = P.prototype;
    C.prototype = new F();
    C.constructor.prototype = C;
    C.superClass = P.prototype;
  }
})();

상속의 한가지 방법이라는 것은 알겠습니다.

제가 알고 있는 prototype의 상속의 방식과 달라서 제가 잘못 하고 있는건지 헷갈려서 질문드립니다.

제가 알고 있는 상속은

let inherit = (function() {
    return function ( C, P ) {
        C.prototype.__proto__ = P.prototype;
    }
})();

이런식으로 표현하는 것으로 알고 있는데, 이런 표기 방식도 마찬가지로 상속이 됨을 확인할 수 있습니다.

instanceof 연산자를 쓰면 마찬가지로 C의 인스턴스와 P가 동일한 prototype을 공유하고있기 때문에 true를 반환합니다.

제가 javascript의 상속 자체를 잘못 이해하고 있는것인지, 굳이 저런식으로 상속을 표현하는 이유가 잘 이해가 안갑니다.