[프로토타입으로 객체지향 구현 코드]

var Dog = function(){};
Dog.prototype.bark = function(){
  return 'woof';
};
 
var Spitz = function(){};
Spitz.prototype = new Dog();
Spitz.prototype.bark = function(){
   return 'woof woof'; //더 시끄러움.
};
  
var dog = new Spitz();

// prototype chain을 이용 해서 OOP 구현
console.log(dog instanceof Dog); //true 대체가능성
console.log(dog.bark()); //woof woof 내적동질성

[프로토타입기반 클래스 구조의 약점과 super]

프로토 타입은 단일 체이닝 구조

var Parent = function(){};
Parent.prototype.test = function(){return 'parent';};
 
var Child = function(){};
Child.prototype = new Parent();
Child.prototype.test2 = function(){return this.test() + 'child';};

// child객체가 부모의 test() 메소드를 사용하려면
// 본인은 test2()와 같이 부모에 정의된 이름을 피해야만 가능
// 체이닝상 본인으로 부모 기능을 가려버리는 경우가 생긴다

var child = new Child();
child.test2(); //parentchild;

클래스 이용시

const Parent = class{
  test(){return 'parent';}
};
 
const Child = class extends Parent{
  test(){return super.test() + 'child';}
};

// class 로 구현하고 extens로 상속받고 super 를 이용하면 부모 클래스 이름 같아도 상관없다

const child = new Child();
child.test(); //parentchild

참고


[es6] 연구노트 #3 - 명확한 객체정의