많은 OO 언어는 인터페이스 상속과 구현 상속이라는 두 가지 상속 방법을 지원합니다. 인터페이스 상속은 메서드 시그니처만 상속하는 반면, 구현 상속은 실제 메서드를 상속합니다. 앞서 언급했듯이 ECMAScript에서는 함수에 서명이 없기 때문에 인터페이스 상속이 불가능합니다. ECMAScript는 구현 상속만 지원하며 구현 상속은 주로 프로토타입 체인에 의존합니다. 여기서는 주로 프로토타입 체인 상속, 빌린 생성자, 결합 상속, 프로토타입 상속, 기생 상속, 기생 조합 상속 등에 대해 설명합니다.
1. 프로토타입 체인
ECMAScript는 프로토타입 체인의 개념을 설명하고 프로토타입 체인을 주요 방법으로 사용하여 상속을 구현합니다. 기본 아이디어는 프로토타입을 사용하여 하나의 참조 유형이 다른 참조 유형의 속성과 메서드를 상속하도록 하는 것입니다. 생성자, 프로토타입 및 인스턴스 간의 관계를 간략하게 검토해 보겠습니다. 각 생성자는 프로토타입 개체를 가지며, 프로토타입 개체에는 생성자에 대한 포인터가 포함되고, 인스턴스에는 프로토타입 개체에 대한 내부 포인터가 포함됩니다. 그렇다면 프로토타입 객체를 다른 유형의 인스턴스와 동일하게 만들면 어떻게 될까요? 분명히 이때 프로토타입 객체에는 다른 프로토타입에 대한 포인터가 포함되며, 이에 따라 다른 프로토타입에도 다른 생성자에 대한 포인터가 포함됩니다. 다른 프로토타입이 다른 유형의 인스턴스인 경우 위의 관계는 여전히 유지되며, 레이어별로 인스턴스와 프로토타입의 체인이 형성됩니다. 이것이 소위 프로토타입 체인의 기본 개념입니다.
function Person(){ this.name=”defaultName”; } Person.property.doAction=function(){ alert(“talk”); } function Student(){ this.age=5; } Student.property=new Person(); Student.property.doSome=function(){ alert(“ homework”); }
프로토타입 체인은 매우 강력하고 상속을 구현하는 데 사용할 수 있지만 몇 가지 문제도 있습니다. 주요 문제는 참조 유형 값을 포함하는 프로토타입에서 발생합니다. 참조 유형 값을 포함하는 프로토타입 속성은 모든 인스턴스에서 공유되며 이것이 프로토타입 객체가 아닌 생성자에서 속성을 정의해야 하는 이유임을 앞서 소개한 것을 기억하실 것입니다. 프로토타입을 통해 상속이 구현되면 프로토타입은 실제로 다른 유형의 인스턴스가 됩니다. 따라서 원래 인스턴스 속성은 자연스럽게 현재 프로토타입 속성이 되었습니다. 프로토타입 체인의 두 번째 문제점은 하위 유형의 인스턴스를 생성할 때 상위 유형의 생성자에 매개변수를 전달할 수 없다는 것입니다. 실제로 모든 객체 인스턴스에 영향을 주지 않고 상위 유형의 생성자에 매개변수를 전달할 수 있는 방법은 없습니다. 이것과 참조 유형 값을 포함하는 프로토타입에 대해 방금 논의한 문제로 인해 프로토타입 체인만으로는 실제로 거의 사용되지 않습니다.
2. 생성자 차용
프로토타입에 참조형 값이 포함되어 발생하는 문제를 해결하는 과정에서 개발자들은 생성자 차용(생성자 훔치기)이라는 방법을 사용하기 시작했습니다. 기술(가짜 개체 또는 고전적 상속이라고도 함). 이 기술의 기본 아이디어는 매우 간단합니다. 하위 유형 생성자 내부에서 상위 유형 생성자를 호출하는 것입니다. 함수는 특정 환경에서 코드를 실행하는 객체일 뿐이라는 점을 잊지 마십시오. 따라서 apply() 및 call() 메서드를 사용하면 (향후) 새로 생성된 객체에서 생성자를 실행할 수도 있습니다.
function Person(name){ this.name=name; } Person.property.doAction=function(){ alert(“talk”); } Person.property.showName=function(){ alert(this.name); } function Student(){ Person.call(this,name); this.age=5; }
생성자만 빌리면 생성자 패턴의 문제를 피할 수 없습니다. 메서드는 모두 생성자에 정의되어 있으므로 함수 재사용은 불가능합니다. 또한 상위 유형의 프로토타입에 정의된 메소드는 하위 유형에도 표시되지 않습니다. 따라서 모든 유형은 생성자 패턴만 사용할 수 있습니다. 이러한 문제를 고려하여 생성자를 빌리는 기술은 단독으로 사용되는 경우가 거의 없습니다.
3. 조합 상속
유사 고전 상속이라고도 불리는 조합 상속은 상속 모델의 장점을 활용하기 위해 프로토타입 체인과 차용 생성자 기술을 결합하는 것을 의미합니다. 그 뒤에 있는 아이디어는 프로토타입 체인을 사용하여 프로토타입 속성과 메서드의 상속을 달성하고 생성자를 빌려 인스턴스 속성의 상속을 달성하는 것입니다. 이러한 방식으로 함수 재사용은 프로토타입에 메서드를 정의하여 달성되며 각 인스턴스는 고유한 속성을 갖도록 보장됩니다.
function Person(name){ this.name=name; this.loves=[“sing”,”paly games”] } Person.property.showLoves=function (){ alert(this.lovers); } function Student(name,age){ Person.class(this,name); This.age=age; } Student.property=new Person(); Student.property.constructor=Student; Student.property.showName=function(){ alert(this.name); }
결합 상속은 프로토타입 체인과 차용 생성자의 단점을 피하고 장점을 결합하며 JavaScript에서 가장 일반적으로 사용되는 상속 패턴이 됩니다. 또한, 결합된 상속을 기반으로 생성된 객체를 식별하는 데에도 instanceof 및 isPrototypeOf()를 사용할 수 있습니다.
4. 프로토타입 상속
function object(o){ function F(){} F.prototype = o; return new F(); }
생성자를 생성하기 위해 많은 노력을 기울일 필요는 없지만 하나의 객체를 다른 객체와 유사하게 유지하려는 경우 , 프로토타입 형식 상속은 완벽하게 가능합니다. 하지만 참조 유형 값을 포함하는 속성은 프로토타입 패턴을 사용하는 것처럼 항상 해당 값을 공유한다는 점을 잊지 마세요.
5. 기생 결합 상속
이른바 기생 결합 상속은 프로토타입 체인의 하이브리드 형태를 통해 생성자를 빌려 속성을 상속하고 메소드를 상속하는 것을 의미합니다.
의 기본 아이디어는 하위 유형의 프로토타입을 지정하기 위해 상위 유형의 생성자를 호출할 필요가 없다는 것입니다. 우리에게 필요한 것은 상위 유형의 프로토타입 복사본뿐입니다. >
. 기본적으로 기생 상속을 사용하여 상위 유형의 프로토타입을 상속한 다음 그 결과를 하위 유형 의 프로토타입에 할당합니다. 기생 조합 상속의 기본 패턴은 다음과 같습니다.function inheritPrototype(subType, superType){ var prototype = object(superType.prototype); //创建对象 prototype.constructor = subType; //增强对象 subType.prototype = prototype; //指定对象 }
个参数:子类型构造函数和超类型构造函数。在函数内部,第一步是创建超类型原型的一个副本。第二步是为创建的副本添加constructor 属性,从而弥补因重写原型而失去的默认的constructor 属性。最后一步,将新创建的对象(即副本)赋值给子类型的原型。这样,我们就可以用调用inheritPrototype()函数的语句,去替换前面例子中为子类型原型赋值的语句了。
集寄生式继承和组合继承的优点与一身,是实现基于类型继承的最有效方式。
以上就是JavaScript面向对象编程(继承实现方式)的内容,更多相关内容请关注PHP中文网(www.php.cn)!