JavaScript 객체 지향 프로그래밍(상속 구현)
많은 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)!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











함수 상속에서는 "기본 클래스 포인터" 및 "파생 클래스 포인터"를 사용하여 상속 메커니즘을 이해합니다. 기본 클래스 포인터가 파생 클래스 개체를 가리키는 경우 상향 변환이 수행되고 기본 클래스 멤버에만 액세스됩니다. 파생 클래스 포인터가 기본 클래스 개체를 가리키는 경우 하향 캐스팅이 수행되므로(안전하지 않음) 주의해서 사용해야 합니다.

상속과 다형성은 클래스 결합에 영향을 줍니다. 상속은 파생 클래스가 기본 클래스에 종속되기 때문에 결합을 증가시킵니다. 다형성은 객체가 가상 함수와 기본 클래스 포인터를 통해 일관된 방식으로 메시지에 응답할 수 있기 때문에 결합을 줄입니다. 모범 사례에는 상속을 적게 사용하고, 공용 인터페이스를 정의하고, 기본 클래스에 데이터 멤버를 추가하지 않고, 종속성 주입을 통해 클래스를 분리하는 것이 포함됩니다. 다형성과 종속성 주입을 사용하여 은행 계좌 애플리케이션에서 결합을 줄이는 방법을 보여주는 실제 예입니다.

상속 오류 디버깅 팁: 올바른 상속 관계를 확인하세요. 디버거를 사용하여 코드를 단계별로 실행하고 변수 값을 검사합니다. 가상 수정자를 올바르게 사용했는지 확인하세요. 숨겨진 상속으로 인해 발생하는 상속 다이아몬드 문제를 살펴봅니다. 추상 클래스에서 구현되지 않은 순수 가상 함수를 확인하세요.

Go 언어는 유형 정의 및 메소드 연관을 통해 객체 지향 프로그래밍을 지원합니다. 전통적인 상속을 지원하지 않지만 구성을 통해 구현됩니다. 인터페이스는 유형 간의 일관성을 제공하고 추상 메소드를 정의할 수 있도록 합니다. 실제 사례에서는 OOP를 사용하여 고객 운영 생성, 획득, 업데이트 및 삭제를 포함하여 고객 정보를 관리하는 방법을 보여줍니다.

PHP의 OOP 모범 사례에는 명명 규칙, 인터페이스 및 추상 클래스, 상속 및 다형성, 종속성 주입이 포함됩니다. 실제 사례에는 웨어하우스 모드를 사용하여 데이터를 관리하고 전략 모드를 사용하여 정렬을 구현하는 것이 포함됩니다.

Golang(Go 언어)에는 전통적인 의미의 클래스 개념이 없지만, 클래스와 유사한 객체지향 기능을 구현할 수 있는 구조체라는 데이터 형식을 제공합니다. 이 기사에서는 구조를 사용하여 객체 지향 기능을 구현하는 방법을 설명하고 특정 코드 예제를 제공합니다. 구조의 정의와 사용법 먼저 구조의 정의와 사용법을 살펴보자. Golang에서는 type 키워드를 통해 구조를 정의한 다음 필요한 곳에 사용할 수 있습니다. 구조에는 속성이 포함될 수 있습니다.

Go 언어는 객체 지향 프로그래밍, 구조체를 통한 객체 정의, 포인터 수신기를 사용한 메서드 정의, 인터페이스를 통한 다형성 구현을 지원합니다. 객체 지향 기능은 Go 언어에서 코드 재사용, 유지 관리 용이성 및 캡슐화를 제공하지만 클래스 및 상속 및 메서드 시그니처 캐스트에 대한 전통적인 개념이 부족하다는 제한 사항도 있습니다.

다음 상황에서는 C++ 함수 상속을 사용하면 안 됩니다. 파생 클래스에 다른 구현이 필요한 경우 다른 구현을 사용하는 새 함수를 만들어야 합니다. 파생 클래스에 함수가 필요하지 않은 경우 빈 클래스로 선언하거나 구현되지 않은 전용 기본 클래스 멤버 함수를 사용하여 함수 상속을 비활성화해야 합니다. 함수에 상속이 필요하지 않은 경우 코드 재사용을 위해 다른 메커니즘(예: 템플릿)을 사용해야 합니다.
