프로토 타입은 최적화 입니다.
그것들을 잘 사용하는 좋은 예는 jQuery 라이브러리입니다. 를 사용하여 jQuery 객체를 얻을 때마다 $('.someClass')해당 객체에는 수십 개의 "메서드"가 있습니다. 라이브러리는 객체를 반환하여이를 달성 할 수 있습니다.
return {
show: function() { ... },
hide: function() { ... },
css: function() { ... },
animate: function() { ... },
// etc...
};
그러나 이는 메모리의 모든 jQuery 객체가 동일한 메서드를 포함하는 수십 개의 명명 된 슬롯을 계속해서 가질 수 있음을 의미합니다.
대신 이러한 메서드는 프로토 타입에 정의되고 모든 jQuery 객체는 해당 프로토 타입을 "상속"하여 매우 적은 런타임 비용으로 모든 메서드를 얻습니다.
jQuery가 올바르게 작동하는 방법에서 가장 중요한 부분은 이것이 프로그래머에게 숨겨져 있다는 것입니다. 라이브러리를 사용할 때 걱정할 필요가없는 것이 아니라 순전히 최적화로 취급됩니다.
JavaScript의 문제는 네이 키드 생성자 함수가 호출자가 접두사를 기억해야 new한다는 점입니다. 그렇지 않으면 일반적으로 작동하지 않습니다. 이것에 대한 타당한 이유가 없습니다. jQuery는 평범한 함수 뒤에 그 말도 안되는 것을 숨겨서 올바르게 가져 오므로 $객체가 구현되는 방식에 신경 쓸 필요가 없습니다.
지정된 프로토 타입으로 객체를 편리하게 생성 할 수 있도록 ECMAScript 5에는 표준 기능이 포함되어 있습니다 Object.create. 크게 단순화 된 버전은 다음과 같습니다.
Object.create = function(prototype) {
var Type = function () {};
Type.prototype = prototype;
return new Type();
};
생성자 함수를 작성한 다음 new.
언제 프로토 타입을 피하겠습니까?
유용한 비교는 Java 및 C #과 같은 인기있는 OO 언어와 비교하는 것입니다. 이들은 두 가지 종류의 상속을 지원합니다.
- 인터페이스 당신 상속, 같은 클래스가 인터페이스의 모든 구성원에 대한 고유의 구현을 제공.
implementinterface
- 일부 메서드의 기본 구현을 제공
extend하는 구현 상속 class.
JavaScript에서 프로토 타입 상속은 구현 상속 의 일종입니다 . 따라서 (C # 또는 Java에서) 기본 동작을 얻기 위해 기본 클래스에서 파생 된 경우 재정의를 통해 약간 수정 한 다음 JavaScript에서 프로토 타입 상속이 의미가 있습니다.
그러나 C # 또는 Java에서 인터페이스를 사용한 상황이라면 JavaScript에서 특정 언어 기능이 필요하지 않습니다. 인터페이스를 나타내는 무언가를 명시 적으로 선언 할 필요가 없으며 해당 인터페이스를 "구현"하는 것으로 객체를 표시 할 필요가 없습니다.
var duck = {
quack: function() { ... }
};
duck.quack(); // we're satisfied it's a duck!
즉, 객체의 각 "유형"에 "메서드"에 대한 고유 한 정의가있는 경우 프로토 타입에서 상속 할 가치가 없습니다. 그 후에는 각 유형에 할당하는 인스턴스 수에 따라 다릅니다. 그러나 많은 모듈 식 디자인에는 주어진 유형의 인스턴스가 하나뿐입니다.
사실, 많은 사람들은 구현 상속이 악하다고 제안했습니다 . 즉, 유형에 대한 몇 가지 일반적인 작업이있는 경우 기본 / 슈퍼 클래스에 넣지 않고 대신 개체를 전달하는 일부 모듈에서 일반 함수로 노출되는 것이 더 명확 할 수 있습니다. 당신은 그들이 작동하기를 원합니다.