웹 프론트엔드 JS 튜토리얼 상속을 구현하기 위해 JavaScript를 사용해야 하는 이유는 무엇입니까? 여러 상속 방법의 예에 대한 자세한 설명

상속을 구현하기 위해 JavaScript를 사용해야 하는 이유는 무엇입니까? 여러 상속 방법의 예에 대한 자세한 설명

Jul 20, 2017 pm 03:55 PM
javascript js

상속을 구현하기 위해 자바스크립트를 사용해야 하는 이유는 무엇입니까?

초기 PC 시스템의 성능은 실제로 서버 측에 있지 않으며 클라이언트 브라우저는 순전히 장식용입니다. 당시 대중적인 테이블 레이아웃과 전화선 인터넷 액세스와 함께 웹 페이지 탐색이 매우 느렸습니다. 현재 인터넷 시대가 급속도로 발전하고 있으며 개인용 컴퓨터 하드웨어가 크게 향상되었으며 클라이언트 브라우저의 성능도 매우 실망스럽습니다. 웹 개발 모델도 조용히 변화하고 있습니다. 서버는 더 이상 이전처럼 "어려워지지" 않습니다. 대신 브라우저는 이러한 방식으로 각 클라이언트에 부담을 분산시켜야 합니다. 기업의 비용 절감은 웹 프런트엔드 개발을 더욱 흥미롭게 만듭니다. 점점 더 많은 프런트엔드 프레임워크가 등장하고 심지어 많은 프런트엔드 MVC 프레임워크도 등장했습니다. 이러한 맥락에서 JavaScript의 역할은 단순히 간단한 확인, 요청 보내기, DOM 운영이 아니라 프런트 엔드 라우팅 및 비즈니스 계층과 같은 더 많은 역할을 수행해야 하며 JavaScript는 많은 논리적 작업을 수행해야 합니다. 이는 프런트엔드 데이터(예: 모델)의 추상화를 포함하고 객체 지향적 사고를 통해서만 추상화된 데이터를 잘 처리할 수 있으므로 여기서 상속은 매우 중요합니다.

이제 프론트 데스크에서 name과 age라는 기본 속성을 가진 Person이라는 모델을 추출합니다. 기본적으로 누구나 말할 수 있으므로 말하기 기능은 각 인스턴스의 프로토타입 객체에 배치되어 즐길 수 있습니다. 이제 Man의 경우 Person의 기본 속성을 상속하고 이를 기반으로 고유한 속성을 추가해야 합니다.


function Person (name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.say = function(){
  console.log('hello, my name is ' + this.name);
};
function Man() {
  //my own properties
}
로그인 후 복사

주요 상속 방법:

1. 프로토타입 체인 상속


function Person (name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.say = function(){
  console.log('hello, my name is ' + this.name);
};
function Man() {
}
Man.prototype = new Person('pursue');
var man1 = new Man();
man1.say(); //hello, my name is pursue
var man2 = new Man();
console.log(man1.say === man2.say);//true
console.log(man1.name === man2.name);//true
로그인 후 복사

이 상속 방법은 위의 Person(인스턴스 및 프로토타입)의 모든 속성 방법을 얻기 위해 매우 직접적입니다. ), 상위 클래스의 new Person('pursue') 인스턴스를 하위 클래스의 프로토타입에 직접 할당합니다. 실제로 하위 클래스의 인스턴스 man1 및 man2 자체는 완전히 비어 있는 객체이므로 모든 속성과 메서드를 프로토타입화해야 합니다. 체인을 찾아보세요. 따라서 발견된 속성 메서드는 동일합니다.
그래서 프로토타입 체인 상속을 직접 사용하는 것은 비현실적입니다.

2. 생성자 상속 사용


function Person (name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.say = function(){
  console.log('hello, my name is ' + this.name);
};
function Man(name, age) {
  Person.apply(this, arguments);
}
//Man.prototype = new Person('pursue');
var man1 = new Man('joe');
var man2 = new Man('david');
console.log(man1.name === man2.name);//false
man1.say(); //say is not a function
로그인 후 복사

여기서 하위 클래스는 생성자에서 적용을 사용하여 상위 클래스의 생성자를 호출하여 상위 클래스의 속성을 상속하는 효과를 얻습니다. 프로토타입 체인을 직접 사용하는 것보다 많은 것이 있고 적어도 각 인스턴스에는 자체 리소스 공유가 있지만 이 메소드는 상위 클래스의 인스턴스 속성만 상속할 수 있으므로 모든 속성을 상속하기 위해 say 메소드를 찾을 수 없습니다. 및 상위 클래스의 메소드, 프로토타입 체인을 수정해야 하므로 조합 상속 메소드가 도입됩니다.

3. 조합 상속


function Person (name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.say = function(){
  console.log('hello, my name is ' + this.name);
};
function Man(name, age) {
  Person.apply(this, arguments);
}
Man.prototype = new Person();
var man1 = new Man('joe');
var man2 = new Man('david');
console.log(man1.name === man2.name);//false
console.log(man1.say === man2.say);//true
man1.say(); //hello, my name is joe
로그인 후 복사

man1과 man2의 인스턴스 속성은 실제로 프로토타입 속성을 재정의하지만 프로토타입의 say 메서드를 재정의하지 않는다는 점에 유의해야 합니다. 따라서 여기서 man1.say === man2.say는 여전히 true를 반환하므로 프로토타입 속성을 재정의하지 않도록 매우 주의해야 합니다. 프로토타입 속성은 모든 인스턴스에 공통되기 때문입니다.

4. 기생 조합 상속

솔직히 다음 형식의 이름이 무엇인지는 잘 모르겠지만 실제로 가장 인기 있고 고전적인 JavaScript 상속 방법입니다. 사실 프로토타입 객체의 구조만 이해하면 됩니다:


function Person (name, age) {
      this.name = name;
      this.age = age;
    }
Person.prototype.say = function(){
  console.log('hello, my name is ' + this.name);
};
function Man(name, age) {
  Person.apply(this, arguments);
}
Man.prototype = Object.create(Person.prototype);//a.
Man.prototype.constructor = Man;//b.
var man1 = new Man('pursue');
var man2 = new Man('joe');
console.log(man1.say == man2.say);
console.log(man1.name == man2.name);
로그인 후 복사

사실 기생 조합 상속과 위 조합 상속의 차이점은 서브클래스의 프로토타입 객체를 구성하는 방식에만 있습니다( a. 및 b.) 여기서 사용되는 Object.creat(obj) 메서드는 다음과 유사하게 들어오는 obj 개체의 얕은 복사본을 만듭니다.


function create(obj){
  function T(){};
  T.prototype = obj;
  return new T();
}
로그인 후 복사

따라서 하위 클래스는 상위 클래스의 프로토타입 객체와 비교됩니다. 하위 클래스의 프로토타입을 직접 복사하는 일반적인 결합 상속(예: Man.prototype = new Person();)과 달리 좋은 연결입니다. 폭력적인 속성 덮어쓰기. 기생 조합 상속 방법은 인스턴스 속성과 프로토타입 속성을 별도로 상속하므로 구현이 더 합리적입니다.

참고: 코드 b는 instanceof의 결과를 변경하지 않지만 생성자가 필요한 시나리오에서는 더 엄격합니다.

위 내용은 상속을 구현하기 위해 JavaScript를 사용해야 하는 이유는 무엇입니까? 여러 상속 방법의 예에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

WordPress 사이트 파일 액세스가 제한됩니다. 도메인 이름을 통해 .txt 파일에 액세스 할 수없는 이유는 무엇입니까? WordPress 사이트 파일 액세스가 제한됩니다. 도메인 이름을 통해 .txt 파일에 액세스 할 수없는 이유는 무엇입니까? Apr 01, 2025 pm 03:00 PM

WordPress 사이트 파일 액세스가 제한됩니다. 최근 .txt 파일에 액세스 할 수없는 이유를 문제 해결하십시오. 미니 프로그램 비즈니스 도메인 이름을 구성 할 때 일부 사용자는 문제가 발생했습니다.

Docker 환경에서 PECL을 사용하여 확장자를 설치할 때 오류가 발생하는 이유는 무엇입니까? 그것을 해결하는 방법? Docker 환경에서 PECL을 사용하여 확장자를 설치할 때 오류가 발생하는 이유는 무엇입니까? 그것을 해결하는 방법? Apr 01, 2025 pm 03:06 PM

Docker 환경을 사용할 때 Docker 환경에 Extensions를 설치하기 위해 PECL을 사용하여 오류의 원인 및 솔루션. 종종 일부 두통이 발생합니다 ...

Binance Security Validator 사용 방법 Binance Security Validator 사용 방법 Mar 27, 2025 pm 04:48 PM

Binance 계정을 안전하게 유지하고 싶으십니까? 이 기사는 Binance Security Authenticator (예 : Google Authenticator)를 사용하는 방법, 다운로드 및 설치, 설정 활성화, 백업 키 및 일일 사용법 팁을 포함하여 계정의 도난을 효과적으로 방지하는 방법에 대해 자세히 설명합니다.

Django 시간 범위 쿼리 : __Range 매개 변수에 종료 날짜가 포함되지 않는 이유는 무엇입니까? Django 시간 범위 쿼리 : __Range 매개 변수에 종료 날짜가 포함되지 않는 이유는 무엇입니까? Apr 01, 2025 pm 04:06 PM

Django 시간 범위 쿼리에 대한 질문 : 종료 날짜가 포함되지 않은 이유는 무엇입니까? 데이터베이스 쿼리에 django를 사용할 때는 종종 시간을 사용해야합니다 ...

내 코드가 API에 의해 데이터를 반환 할 수없는 이유는 무엇입니까? 이 문제를 해결하는 방법? 내 코드가 API에 의해 데이터를 반환 할 수없는 이유는 무엇입니까? 이 문제를 해결하는 방법? Apr 01, 2025 pm 08:09 PM

내 코드가 API에 의해 데이터를 반환 할 수없는 이유는 무엇입니까? 프로그래밍에서 우리는 종종 API가 호출 될 때 NULL 값을 반환하는 문제를 겪는 경우가 종종 있습니다.

Jiutian Computing Power 플랫폼 작업 : 로컬 컴퓨터가 종료 된 후 컴퓨팅 작업이 계속 실행됩니까? Jiutian Computing Power 플랫폼 작업 : 로컬 컴퓨터가 종료 된 후 컴퓨팅 작업이 계속 실행됩니까? Apr 01, 2025 pm 11:57 PM

Jiutian Computing Power 플랫폼의 로컬 컴퓨터가 닫힌 후 작업 상태에 대한 토론. 인공 지능 훈련을 위해 Jiutian Computing Power 플랫폼을 사용할 때 많은 사용자가 질문에 직면 할 것입니다 ...

Typecho 경로 일치 충돌 : 왜 내/test/tag/his/10086 testtagpage 대신 testtagindex와 일치 하는가? Typecho 경로 일치 충돌 : 왜 내/test/tag/his/10086 testtagpage 대신 testtagindex와 일치 하는가? Apr 01, 2025 am 09:03 AM

Typecho 라우팅 일치 규칙 분석 및 문제 조사이 기사는 Typecho 플러그인 라우팅 등록 및 실제 일치 결과의 일관되지 않은 결과에 대한 질문을 분석하고 답변합니다.

See all articles