JavaScript는 객체 지향 언어이지만 상속 메커니즘은 처음부터 다른 전통적인 객체 지향 언어와 다릅니다. 프로토 타입 기반 상속 메커니즘입니다. 그러나이 메커니즘 하에서는 여전히 상속을위한 몇 가지 다른 구현 방법이 있습니다.
방법 1 : 고전 상속
소위 클래스 상속은 전통적인 객체 지향 언어의 상속 방법을 모방하는 것을 말합니다. 상속 및 상속 당사자는 모두 "클래스"입니다. 코드는 다음과 같습니다.
먼저 부모 클래스 (또는 슈퍼 클래스)를 정의합니다.
기능인 (이름) {this.name = 이름; } person.prototype.getname = function () {return this.name; };부모 클래스 담당자의 속성은 생성자에 정의되어 서브 클래스의 이름 속성이이 속성을 공유하지 않지만 서브 클래스에 별도로 속합니다. getName 메소드는 프로토 타입에 장착되어 서브 클래스의 여러 인스턴스 가이 메소드 본문을 공유하도록 하위 클래스의 여러 인스턴스를 허용하여 메모리를 저장할 수 있도록합니다 (여러 인스턴스의 경우 새로운 인스턴스가 나올 때마다 이러한 인스턴스의 getName 메소드가 독립 공간이 아닌 동일한 메모리 공간을 반영하도록합니다).
다음과 같이 상속 방법을 정의하십시오.
함수 확장 (서브 클래스, 슈퍼 클래스) {var f = function () {}; f. prototype = superclass.prototype; subclass.prototype = new f (); Subclass.prototype.constructor = 서브 클래스; 서브 클래스 .superclass = superclass.prototype; if (superclass.prototype.constructor == Object.Prototype.constructor) {superclass.prototype.constructor = 슈퍼 클래스; }}이 방법에서는 먼저 새 클래스 F를 만들고 프로토 타입을 부모 클래스의 프로토 타입으로 만들고 서브 클래스의 프로토 타입이 클래스 F 인스턴스를 가리키려면 부모 클래스를 상속하는 목적을 달성하십시오. 동시에, 서브 클래스의 프로토 타입이 수정되기 때문에, 수정 된 프로토 타입의 생성자 속성은 서브 클래스를 가리키므로 생성자 함수가 있고 동시에 서브 클래스는 슈퍼 클래스 속성을 장착 할 수있다. 서브 클래스는이 속성을 통해 부모 클래스를 호출하여 서브 클래스와 부모 클래스 간의 관계를 설정할 수 있습니다.
다음과 같이 부모 계급 사람을 물려 받기 위해 서브 클래스 저자를 정의하십시오.
기능 저자 (이름, 책) {author.superclass.constructor.call (this, name); 이. 책 = 책; } extend (저자, 사람); author.prototype.getbooks = function () {return this.book; }여기서, 부모 클래스의 생성자는 서브 클래스 생성자의 슈퍼 클래스 속성을 통해 호출됩니다. 동시에, 호출 메소드는 메소드 호출 의이 포인터를 변환하는 데 사용되므로 서브 클래스 저자는 부모 클래스의 속성을 상속 받고 서브 클래스에도 자체 속성 책이 있습니다. 따라서 매개 변수 책은 구성의 목적을 달성하기 위해 생성자의 속성 책에 할당됩니다. 확장 기능을 사용하여 부모 클래스 개인 프로토 타입의 속성과 메소드를 상속 받으십시오 (실제로 방법만이 프로토 타입에 메소드를 장착하고 속성이 생성자에 정의되기 때문에 상속됩니다). 동시에, 저자는 자체 방법 GetBooks를 가지고있어 해당 프로토 타입에 장착하여 상속을 기반으로 더 확장하는 목적을 달성합니다.
이 상속 방법은 분명히 전통적인 객체 지향 언어와 유사한 유형 상속입니다. 장점은 전통적인 객체 지향 개념에 익숙한 프로그래머에게는 쉽다는 것입니다. 단점은 프로세스가 비교적 번거롭고 메모리 소비가 약간 더 크다는 것입니다. 서브 클래스에는 자체 생성자와 프로토 타입이 있고 서브 클래스와 부모 클래스의 속성이 완전히 분리되어 있기 때문입니다. 두 사람이 같은 값이더라도 같은 메모리를 공유 할 수 없습니다.
방법 2 : 프로토 타입 상속
먼저 부모 클래스를 정의하십시오. 여기서 우리는 의도적으로 생성자를 사용하여 그것을 정의하는 것을 모방하지 않지만, 부모 클래스 인 객체 리터럴 형태로 객체를 직접 정의합니다.
var person = {name : 'default name', getName : function () {return this.name; }};첫 번째 메소드와 마찬가지로 객체에는 속성 이름과 메소드 getName이 있습니다.
그런 다음 다음과 같이 하위 클래스의 상속을 구현하기 위해 클로닝 방법을 정의합니다.
함수 클론 (obj) {function f () {} f.prototype = obj; 새로운 f ()를 반환합니다. }복제 방법은 새로운 객체를 생성하고, 객체의 프로토 타입을 부모 클래스, 즉 매개 변수 OBJ에 가리키고 동시에 객체를 반환합니다.
마지막으로 서브 클래스는 다음과 같이 복제 기능을 통해 상위 클래스를 상속합니다.
var 저자 = 클론 (사람); author.book = [ 'javaScript']; author.showbook = function () {return this.book; }여기서 서브 클래스가 정의되고 상위 클래스 사람은 클론 기능을 통해 상속되고 속성 책이 확장되고 메소드 쇼 북이 확장됩니다. 여기서 서브 클래스에는 속성 이름이 있지만 부모 클래스의 이름 값과 동일하므로 재정의되지 않습니다. 다른 경우 사용할 수 있습니다.
author.name = '새 이름'; 이 속성을 덮어 쓰면 서브 클래스의 새 이름 속성 값을 얻으십시오.
이 프로토 타입 상속은 클래스 상속보다 단순하고 자연 스럽습니다. 동시에, 서브 클래스와 상위 클래스 속성 값의 속성이 동일하고 수정 될 수 있다면 실제로 동일한 메모리 공간을 공유 할 수 있습니다. 예를 들어, 위의 이름 속성은 전통적인 객체 지향 프로그램에 익숙한 프로그래머에게는 이해하기 어렵습니다. 두 사람을 선택한다면이 방법은 의심 할 여지없이 더 좋습니다.
JavaScript는 상속을 구현하기위한 프로토 타입 기반 접근법을 채택하고 각 객체의 프로토 타입은 특정 클래스의 인스턴스 (여러 인스턴스가 아님)를 가리킬 수 있으므로 여러 상속을 구현하는 방법 (즉, 클래스가 여러 클래스의 방법과 속성을 동시에 동시에 가지고 있으며, 이러한 방법과 속성을 내부적으로 정의하지 않도록하십시오).
JavaScript 디자인 패턴에서 믹스 인 클래스가 제공됩니다.
먼저, 도핑 클래스를 정의하여 일반적으로 사용되는 몇 가지 방법과 속성을 저장하십시오. 이러한 방법과 속성은 확장을 통해 다른 클래스에 추가 될 수 있으므로 추가 된 클래스에 클래스의 특정 방법과 속성이 있습니다. 여러 도핑 클래스가 정의되어 동시에 클래스에 추가되면 클래스는 간접적으로 "다중 상속"을 구현합니다. 이 아이디어를 기반으로 구현은 다음과 같습니다.
요소 우세 클래스의 정의 :
var mixin = function () {}; mixin.prototype = {Serialize : function () {var output = []; for (this in this in this) {output.push (key+":"+this [key]); } return output.join ( ','); }}도핑 클래스에는 스스로를 가로 지르고 자체 속성 및 속성 값을 출력하는 데 사용되는 직렬화 메소드가 있으며 쉼표로 분리 된 문자열로 반환합니다.
확장 방법을 정의하여 클래스가 확장 후 다중 그룹 클래스의 속성 또는 방법을 갖도록합니다.
함수 증강 (채권 클래스, GivingClass) {if (arguments [2]) {for (var i = 2, len = arguments.length; i <len; i ++) {수신 class.prototype [arguments [i]] = GiveClass.protopleate [arguments [i]]; }} else {for (getsclass.prototype의 메소드 이름) {if (! riceiveClass.prototype [methodName]) {receativeClass.Prototype [methodName] = gowClass.Prototype [MethodName]; }}}}이 방법에는 기본적으로 두 개의 매개 변수가 있습니다. 첫 번째 매개 변수는 확장 클래스를 수용하고, 두 번째 매개 변수는 DOPED 클래스 (다른 클래스를 확장하는 데 사용)이며 다른 매개 변수가있을 수 있습니다. 두 개의 매개 변수보다 큰 경우 후속 매개 변수는 메소드 또는 속성 이름이며, 확장 클래스가 DOPED 클래스의 지정된 속성 또는 메소드를 상속 받기를 원한다는 것을 나타냅니다. 그렇지 않으면, 도핑 클래스의 모든 속성과 방법은 기본적으로 상속됩니다. 이 기능에서, 첫 번째 IF 분기는 지정된 속성 및 메소드를 상속하는 데 사용되며 다른 분기는 모든 속성과 메소드가 기본적으로 상속되는 경우입니다. 이 방법의 본질은 확장 클래스의 프로토 타입으로 요소 도핑 클래스의 프로토 타입에서 특성과 방법을 확장 (추가)하여 요소 도핑 클래스의 속성과 방법을 갖도록하는 것입니다.
마지막으로 확장 방법을 사용하여 다중 상속을 달성하십시오
증강 (저자, 믹스 인); var 저자 = 새 저자 ( 'js', [ 'JavaScript Design Patterns']); ALERT (author.serialize ());
다음은 저자의 클래스입니다. 이 클래스는 개인의 부모 클래스에서 물려 받고 대사 된 클래스 믹스의 방법과 특성도 있습니다. 원하는 경우 N 대사 클래스를 정의하여 클래스를 확장 할 수 있습니다. 또한 여러 상속이 실현되도록 정의하는 다른 대사 클래스의 특성과 방법을 상속 할 수 있습니다. 마지막으로, 저자의 직렬화 방법의 작동 결과는 다음과 같습니다.
이 클래스에는 Person Class, Author Class 및 Mixin 클래스의 속성과 방법이 모두 있음을 알 수 있습니다. 사람과 믹스 인의 특성과 방법은 모두 "상속"을 통해 얻습니다. 실제로, 그것은 여러 상속을 깨닫습니다.