:정보시스템의 미완선 버전 또는 중요한 기능들이 포함되어 있는 시스테믜 초기 모델
Javascript에서는 Java,C++과 같은 클래스 기반 객체지향 프로그래밍 언어와 달리 ProtoType기반 객체지향 프로그래밍 언어이다. 기존 클래스기반 객체지향 프로그래밍 언어에서는 객체 생성 이전에 클래스를 정의하고 이를 통해 객체(인스턴스)를 생성한다. 하지만 프로토 타입 기반 객체지향 프로그래밍언어는 클래스없이도 객체를 생성할 수있다. 자바스크립트의 객체는 자신의 부모 역할을 담당하는 객체와 연결되어 있다. 그리고 이것은 마치 객체 지향의 상속 개념과 같이 부모 객체의 property 또는 method를 상속받아 사용할 수 있게 된다. 이러한 부모 객체를 prototype 객체 라고 한다.prototype 객체는 생성자 함수에 의해 생성된 각각의 객체에 공유 property를 제공하기 위해 사용한다.
상속되는 property와 method는 각 객체가 아니라 객체의 생성자의 prototype이라는 속성에 정의되어 있다. 객체 인스턴스와 프로토타입 간에 연결(proto 속성으로 객체 인스턴스에 구현하고 있다) 이 구성되며 이 연결을 따라 프로토타입 체인을 타고 올라가며 속성과 메소드를 탐색한다.
-ProtoType object: 자바스크립트 의 모든 객체는 자신의 부모 역할을 담당하는 객체와 연결되어 이다. 이러한 부모 객체를 프로토타입이객체 또는 프로토타입이라고 한다.
-ProtoType chain:프로토타입 객체가 상위 프로토타입 객체로부터 메소드와 속성을 상속 받을 수 있고 그 상위 프로토타입도 상위 프로토타입 객체에 상속을 받는 구조
Function Person(fisrt,last,age,gender,interests){
...속성과 메소드
.sleep{
//
}
}
이러한 객체를 생성한뒤 인스턴스를 만들게 되면 옆에 자동완성 팝업에 gender,age,interests,등등 볼수 있다. 또한 watch,valueOf 처럼 object에 정의된 다른 멤버들도 볼 수 있다. 이것이 프로토 타입 체인이 동작한다는 증거이다.
object에 정의되어있는 메소드를 인스턴스에 호출하면 값을 반환하게 된다. 동작 되는 원리는 인스턴스가 메소드를 가지고 있는지 체크하고 없으면 프로토타입 객체에 메소드가 있는지 확인하고
없으면 object가 메소드가 있는지 체크를 하게된다.
예를들어 person1의 객체가 valueOf 메소드를 가지고 있는지 체크하고 없으면 프로토타입 객체인 person이 있는지 확인하고 없으면 object의 메소드가 이는지 확인하고 호출을 하게 된다.
프로토 타입 체인에서 한 객체의 메소드와 속성들이 다른 객체로 복사되는 것이아니라 체인을 타고 올라가며 접근을 하는 것이다
이렇게 상속을 받을 받지만 전체의 속성과 메소드를 상속받는 것은 아니다. 그 이유는 상속받은 멤버들은 prototype 속성에 정의되어 있기 때문이다. Object.이아니라 Object.prototype로 시작하는 것들이다. prototype속성도 하나의 객체이며 프로토 타입 체인을 통해 상속하고자 하는 속성과 메소드를 담아두는 버킷으로 주로 사용되는 객체이다.
Object.is(),Objet.keys()등 protorype 버켓이 정의도지 않은 멤버들은 상속되지 않는다. 이 것들은 Object() 생성자에서만 사용할 수 있는 멤버이다.
Object를 상속받은 객체에서 사용 가능한 수 많은 메소드들이 Object의 prototype 속성에 정의 되어 있음을 알 수있다.이 프로토 타입 객체들에는 이미 많은 수의 메소드가 정의되어 있다.
예를들어 문자열을 객체를 생성했을 때 split(),indexOf(),replace()등의 문자열으 위한 유용한 메소드를 사용할수 있는 이유이다.
Person (Class)
(.constructor)↑ ↓(.prototype)
Person.prototype(prototype)
(.proto)↑ ↓(.insantiation)
Person1(instance)
ex)
Person.prototype..constructor ===Person
Person.prototype ===person1.proto
Person.prototype.sleep === person1.sleep
배열 문자열 다 마찬가지로 prototype 객체이다.
Java나 TypeScript 언어에는 클래스 내부에서만 쓰이는 속성 및 메소드를 구분시키기 위해 private 이라는 키워드를 제공한다. 하지만 자바스크립트에서는 잘 쓰지 않는다. 자바스크립트에서는 은닉화를 하기 위해 일반적으로 클로저 모듈 패턴을 사용한다. 클래스나 인스턴스 형태로 만들때에는 다른 방법을 사용한다.
추상화는 속성과 메소드의 이름만 노출시켜서 사용을 단순화한다는 의미를 갖고 있다. 인터페이스는 클래스를 구현하는 사람들이 이에 맞게 작성할 수 있게 돕는 것이다. 클래스를 이용하는 입장에서 노출된 인터 페이스를 통해 "이 클래스는 메소드 이름이 의도한 바대로 작동할 것이다"라는 것을 명백히 드러나게 해준다. 또한 실질적인 구현 방법을 공개하지 않고 사용법을 노출시키기에도 유리하다. 어떤 클래스가 외부 공개용으로 모듈처럼 작동할 때에 이러한 인터페이스는 빛을 발한다. 이러한 인터 페이스 사용의 대표적인 예가 API이다.