Javascript가 프로토 타입 기반 언어라는 것은 무엇을 의미합니까?


255

Javascript의 주요 장점 중 하나는 프로토 타입 기반 언어라는 것입니다.

그러나 Javascript가 프로토 타입 기반이라는 것은 무엇을 의미하며, 이것이 왜 이점이 있습니까?


3
:이 답변은 프로토 타입 상속에 대해 알아야 할 모든 것을 설명 stackoverflow.com/a/16872315/783743
Aadit M 샤

답변:


291

프로토 타입 상속 은 객체 지향 코드 재사용 의 한 형태입니다 . Javascript는 프로토 타입 상속을 사용하는 유일한 [주류] 객체 지향 언어 중 하나입니다. 거의 모든 다른 객체 지향 언어는 고전적입니다.

에서 고전 상속 , 프로그래머는 객체를 정의하는 클래스를 작성합니다. 동일한 클래스에서 여러 객체를 인스턴스화 할 수 있으므로 프로그램의 여러 객체를 설명하는 코드가 한 곳에 있습니다. 그런 다음 클래스를 계층 구조로 구성하여 코드 재사용을 향상시킬 수 있습니다. 보다 일반적인 코드는 상위 수준 클래스에 저장되며 하위 수준 클래스는 상속됩니다. 이것은 객체가 부모 클래스뿐만 아니라 같은 클래스의 다른 객체와 코드를 공유한다는 것을 의미합니다.

에서 프로토 타입 상속 형태의 객체는 직접 상속 다른 개체에서. 수업에 관한 모든 사업은 사라집니다. 객체를 원한다면 객체를 작성하면됩니다. 그러나 코드 재사용은 여전히 ​​가치있는 일이므로 객체를 계층 구조로 함께 연결할 수 있습니다. 자바 스크립트에서 모든 객체에는 객체를 만든 비밀 링크가있어 체인을 형성합니다. 객체가 가지고 있지 않은 속성을 요구할 때, 부모 객체는 속성이 발견 될 때까지 또는 루트 객체에 도달 할 때까지 지속적으로 체인 위로 요청됩니다.

JavaScript의 각 함수 (객체 자체)에는 실제로 "prototype"이라는 멤버가 있습니다.이 멤버는 객체를 요청할 때 값을 제공합니다. 이 멤버가 있으면 생성자 메커니즘 (객체가 함수로 구성되는)이 작동 할 수 있습니다. 함수 객체의 프로토 타입에 속성을 추가하면 생성 된 객체와 그로부터 상속 된 모든 객체에 속성을 사용할 수 있습니다.

장점

프로토 타입 상속이 유리한 코드 재사용 형식 인 이유에 대해서는 단단하고 빠른 규칙이 없을 수 있습니다. 코드 재사용 자체가 유리하며 프로토 타입 상속은 그에 대한 합리적인 방법입니다. 프로토 타입 상속은 상당히 간단한 코드 재사용 모델 이며이 코드는 직접적인 방식 으로 크게 재사용 될 수 있습니다 . 그러나 고전 언어는 확실히 이것을 달성 할 수 있습니다.

주석 : @Andrew Hedges 는 실제로 많은 프로토 타입 언어 가 있다는 점을 지적 합니다. 이러한 다른 것들이 존재한다는 사실은 주목할 가치가 있지만, 그들 중 어느 것도 주류에 가까운 것은 없다는 점도 주목할 가치가 있습니다. NewtonScript는 한동안 약간의 견인력이있는 것처럼 보였지만 플랫폼으로 죽었습니다. 프로토 타입 기능을 추가하는 방식으로 일부 현대 언어를 확장 할 수도 있습니다.


9
켈리 자바 스크립트가 있지만 지금까지 가장 인기 프로토 타입 언어, 많은 사람들이 있습니다 en.wikipedia.org/wiki/Prototype-based_programming#Languages
앤드류 헤지스

2
앤드류 좋은 지적. 나는 더 분명 했어야했다. 메모 해 드리겠습니다.
keparo

3
이 내용도 읽어보십시오. developer.mozilla.org/en/JavaScript/Guide/…
pramodc84

1
좋은 답변을 얻으려면 +1하십시오. 하나의 작은 의견 : 나에게 고전 상속은 프로토 타입보다 "직접적인"것처럼 보인다. 실제로 프로토 타입 객체는 단순한 다른 링크 (다른 객체에 대한 링크)로 간주되는 반면 컴파일 된 OOP에서는 기본 클래스가 "직접 상속 된"것으로 간주합니다. 따라서 프로토 타입 객체는 상속되지 않고 연결됩니다 (상속성은 다소 위조됩니다). 이견있는 사람?
죄수 제로

3
@PrisonerZERO : 저는 프로토 타입 상속이 클래식보다 직접적이라고 주장합니다. 객체 B가 객체 A가 가리키는 클래스에서 상속하는 클래스를 가리키는 대신 객체 A를 직접 가리키고 "...를 제외하고는 그 객체와 같습니다." 프로토 타입 상속에 대한 가장 큰 점과 대부분의 사람들이 내재화하기가 가장 어려워 보이는 것은 인스턴스와 유형을 구분하지 않는다는 것입니다. 모든 개체는 모두 유형 및 인스턴스. 둘 사이의 구별은 인공적이고 고의적이며 일반적으로 계급 지향적 사고 방식에 갇힌 증상입니다.
cHao

54

프로토 타입 기반 언어는 클래스와 객체를 구별하지 않고 단순히 객체를 갖습니다. 프로토 타입 기반 언어에는 프로토 타입 객체라는 개념이 있으며, 새로운 객체의 초기 속성을 가져 오는 템플릿으로 사용되는 객체입니다. 모든 객체는 객체를 만들거나 런타임에 고유 한 속성을 지정할 수 있습니다. 또한 모든 객체를 다른 객체의 프로토 타입으로 연결할 수 있으므로 두 번째 객체가 첫 번째 객체의 속성을 공유 할 수 있습니다.


6
아주 좋은 설명이지만 "초기 속성에 대한 템플릿"에 대한 주석으로 약간 오해의 소지가 있습니다. 객체를 인스턴스화 한 후 프로토 타입을 변경해도 해당 객체는 여전히 해당 기능을 수신합니다.
nickf

32

프로토 타입 기반 프로그래밍은 클래스가없는 객체 지향 프로그래밍 스타일이며 프로토 타입 역할을하는 기존 객체를 복제하여 동작 재사용 (또는 클래스 기반 언어의 상속)을 수행합니다.


아직도 이런 식으로 느끼십니까? 그렇다면 그렇다면 이것은 실제로 나와 "확실히"클릭 한 최초의 설명이기 때문입니다.
Chazt3n

11

장점 / 단점은 클래스 (정적 코드)를 정의 할 필요없이 런타임에 새로운 종류의 객체를 만들 수 있다는 것입니다. 대부분의 기능과 마찬가지로 장점 / 불이익으로 설정하는 것은 개발자의 책임입니다.

객체는 본질적으로 자바 스크립트에서 기능하기 때문에 가능합니다 (클로저도).


동적 객체는 자바 스크립트의 이점이지만 실제로는 프로토 타입 또는 기능적 언어 인 자바 스크립트와 관련이 없습니다. 많은 고전 언어에서 런타임에 동적 객체를 만들 수 있습니다. 클로저도 다소 관련이 없습니다.
keparo

2
클래스는 반드시 정적 코드 일 필요는 없습니다. 파이썬은 클래스 자체가 객체이고 메타 클래스가 객체 인 메타 클래스로 구성되어 있습니다.
Tomasz Zieliński

6

클래스 구조를 선언하는 대신 동일한 유형의 객체를 만들고 객체의 프로토 타입을 사용하여 언제든지 정의에 추가 할 수 있습니다. 일반적인 방법보다 유연합니다.


6

컴파일시 클래스 대신 런타임에 객체를 사용하여 새 객체를 작성하면 객체에 대한 세부 사항을 알지 않고도 객체를 확장 할 수 있습니다. 물론 사용법에 따라 매우 단점이 될 수 있습니다. 여기서는 언어에 대해 가정하지 않으므로 동적이 아닌 javascript 이외의 언어에 적용됩니다.

myobject.prototype=unkownobject;
myobject.newproperty=1;

거의 어디에서나 객체를 얻을 수 있습니다. 네트워크, 데이터베이스, 외부 연결 등의 고유 코드

언어는 자바 스크립트와 같은 프로토 타입 상속을 구현할 필요가 없습니다. 자바 스크립트에서 프로토 타입 객체는 단순히 공유되며 상속자 사이에서도 속성이 공유됩니다. 대안은 프로토 타입의 모든 속성을 새 객체로 복사하는 것입니다. 각 접근 방식은 상황에 따라 장점이 있습니다. 나는 두 번째를 더 좋아하지만 자바 스크립트가하는 것이 아닙니다.


6

모든 답변을 읽은 후 결론입니다.

1) 객체가 다른 객체로부터 직접 상속되는 상속

2) 클래스를 사용하지 않습니다

3) 인스턴스 기반 프로그래밍 또는 클래스리스 프로토 타입 지향 프로그래밍이라고도 함

4) 동작 재사용은 프로토 타입 역할을하는 기존 객체를 복제하여 수행됩니다.

5) 새로운 객체에서 템플릿으로 사용 된 객체는 초기 속성을 얻습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.