웹 프론트엔드 JS 튜토리얼 다양한 상속 방법과 js의 장점과 단점 소개

다양한 상속 방법과 js의 장점과 단점 소개

May 13, 2017 am 10:51 AM

이 글은 주로 JavaScript상속에 대한 심층적 이해의 다양한 방법과 장단점을 소개합니다. 관심 있는 친구들은 참고할 만한 가치가 있습니다.

앞서 작성

본 글에서는 자바스크립트의 다양한 상속 방식과 장단점을 설명하고 있습니다.

참고:

은 "JavaScript 심층

객체 생성"과 동일하며 노트에 더 가깝습니다.

안녕, 다시 한 번 한숨을 쉬겠습니다. "JavaScript Advanced 프로그래밍"은 정말 잘 작성되었습니다!

1. 프로토타입 체인 상속

function Parent () {
  this.name = 'kevin';
}

Parent.prototype.getName = function () {
  console.log(this.name);
}

function Child () {

}
Child.prototype = new Parent();

var child1 = new Child();

console.log(child1.getName()) // kevin
로그인 후 복사

문제:

1.

속성을 참조합니다. 모든 인스턴스에 의해 공유됩니다. 예:

function Parent () {
  this.names = ['kevin', 'daisy'];
}
function Child () {

}

Child.prototype = new Parent();

var child1 = new Child();

child1.names.push('yayu');

console.log(child1.names); // ["kevin", "daisy", "yayu"]

var child2 = new Child();

console.log(child2.names); // ["kevin", "daisy", "yayu"]
로그인 후 복사

2. Child 인스턴스를 생성할 때 매개변수를 Parent에 전달할 수 없습니다.

2.

생성자(클래식 상속)

function Parent () {
  this.names = ['kevin', 'daisy'];
}

function Child () {
  Parent.call(this);
}

var child1 = new Child();

child1.names.push('yayu');

console.log(child1.names); // ["kevin", "daisy", "yayu"]

var child2 = new Child();

console.log(child2.names); // ["kevin", "daisy"]
로그인 후 복사

장점:

모든 인스턴스에서 참조 유형 속성을 공유하지 않음

2. 하위의 상위에 매개변수를 전달할 수 있습니다.

예:

function Parent (name) {
  this.name = name;
}

function Child (name) {
  Parent.call(this, name);
}

var child1 = new Child('kevin');

console.log(child1.name); // kevin

var child2 = new Child('daisy');

console.log(child2.name); // daisy
로그인 후 복사

단점:

메서드가 생성될 때마다 생성자에 정의됩니다. 인스턴스가 생성된 시간입니다.

3. 조합 상속


프로토타입 체인 상속과 클래식 상속은 두 개의 칼을 결합한 것입니다.

function Parent (name) {
  this.name = name;
  this.colors = ['red', 'blue', 'green'];
}

Parent.prototype.getName = function () {
  console.log(this.name)
}

function Child (name, age) {

  Parent.call(this, name);
  
  this.age = age;

}

Child.prototype = new Parent();

var child1 = new Child('kevin', '18');

child1.colors.push('black');

console.log(child1.name); // kevin
console.log(child1.age); // 18
console.log(child1.colors); // ["red", "blue", "green", "black"]

var child2 = new Child('daisy', '20');

console.log(child2.name); // daisy
console.log(child2.age); // 20
console.log(child2.colors); // ["red", "blue", "green"]
로그인 후 복사

장점: 프로토타입 체인 상속과 생성자의 장점을 결합한 것으로, JavaScript에서 가장 일반적으로 사용되는 상속 패턴입니다.

4. 프로토타입 상속

function createObj(o) {
  function F(){}
  F.prototype = o;
  return new F();
}
로그인 후 복사
는 ES5

Object

.create의 시뮬레이션된 구현으로, 수신 객체를 생성된 객체의 프로토타입으로 사용합니다. . 단점:

참조 유형이 포함된 속성 값은 항상 해당 값을 공유하며 이는 프로토타입 체인 상속과 동일합니다.

var person = {
  name: 'kevin',
  friends: ['daisy', 'kelly']
}

var person1 = createObj(person);
var person2 = createObj(person);

person1.name = 'person1';
console.log(person2.name); // kevin

person1.firends.push('taylor');
console.log(person2.friends); // ["daisy", "kelly", "taylor"]
로그인 후 복사

참고:

값을 수정한 후에도

값이 변경되지 않은 이유는 person1.nameperson2.name가 독립적인 이름 값을 갖기 때문이 아니라 person1 때문입니다. .person2프로토타입의 이름 값이 수정되는 것이 아니라 이름 값이 추가됩니다. person1.name = 'person1'person1

5. 기생 상속


상속 프로세스를 캡슐화하는 데만 사용되는 함수를 만듭니다. 이 함수는 마지막으로 객체를 내부적으로 향상시킵니다. 객체가 반환됩니다.

function createObj (o) {
  var clone = object.create(o);
  clone.sayName = function () {
    console.log('hi');
  }
  return clone;
}
로그인 후 복사

단점: 차용된 생성자 패턴과 마찬가지로 객체가 생성될 때마다 메서드가 생성됩니다.

6. 기생 결합 상속


모두의 읽기 편의를 위해 결합 상속 코드는 여기에서 반복됩니다:

function Parent (name) {
  this.name = name;
  this.colors = ['red', 'blue', 'green'];
}

Parent.prototype.getName = function () {
  console.log(this.name)
}

function Child (name, age) {
  Parent.call(this, name);
  this.age = age;
}

Child.prototype = new Parent();

var child1 = new Child('kevin', '18');

console.log(child1)
로그인 후 복사

Combined 상속 가장 큰 단점은 부모 생성자가 두 번 호출된다는 것입니다.

하위 유형 인스턴스의 프로토타입을 설정할 때 한 번:

Child.prototype = new Parent();
로그인 후 복사

하위 유형 인스턴스를 만들 때 한 번:

var child1 = new Child('kevin', '18');
로그인 후 복사

new의 시뮬레이션 구현을 기억하세요. 실제로 여기 문장에서, 다음을 실행합니다:

Parent.call(this, name);
로그인 후 복사

여기서 Parent 생성자를 다시 호출합니다.

따라서 이 예에서 child1 객체를 인쇄하면 Child.prototype과 child1 모두 colors라는 속성이 있고 속성 값은 ['red', 'blue', ' 녹색'] .

그럼 이번에는 어떻게 계속 개선하고 반복 통화를 피할 수 있을까요?

Child.prototype = new Parent()를 사용하지 않고 Child.prototype이 Parent.prototype에 간접적으로 액세스하도록 허용하면 어떻게 되나요?

구현 방법을 살펴보겠습니다:

function Parent (name) {
  this.name = name;
  this.colors = ['red', 'blue', 'green'];
}

Parent.prototype.getName = function () {
  console.log(this.name)
}

function Child (name, age) {
  Parent.call(this, name);
  this.age = age;
}
// 关键的三步
var F = function () {};

F.prototype = Parent.prototype;

Child.prototype = new F();


var child1 = new Child('kevin', '18');

console.log(child1);
로그인 후 복사

마지막으로 이 상속 방법을 캡슐화해 보겠습니다.

function object(o) {
  function F() {}
  F.prototype = o;
  return new F();
}

function prototype(child, parent) {
  var prototype = object(parent.prototype);
  prototype.constructor = child;
  child.prototype = prototype;
}

// 当我们使用的时候:
prototype(Child, Parent);
로그인 후 복사

"JavaScript Advanced 프로그래밍"에서 기생 조합 상속에 대한 칭찬을 인용하자면:

이 방법의 높은 효율성은 Parent 생성자를 한 번만 호출하므로 Parent.prototype에 불필요하고 중복되는 속성이 생성되는 것을 방지한다는 점을 반영합니다. 동시에 프로토타입 체인은 변경되지 않은 상태로 유지되므로, instanceof 및 isPrototypeOf는 계속해서 정상적으로 사용될 수 있습니다. 개발자는 일반적으로 기생 구성 상속이 참조 유형에 대한 가장 이상적인 상속 패러다임이라고 믿습니다.

【관련 추천】


1.

특별 추천: "php Programmer Toolbox" V0.1 버전 다운로드 2.

무료 js 온라인 동영상 튜토리얼

3.

php.cn Dugu Jiujian (3) - JavaScript 동영상 튜토리얼

위 내용은 다양한 상속 방법과 js의 장점과 단점 소개의 상세 내용입니다. 자세한 내용은 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)

C++ 함수 상속에 대한 자세한 설명: 상속에서 '기본 클래스 포인터'와 '파생 클래스 포인터'를 사용하는 방법은 무엇입니까? C++ 함수 상속에 대한 자세한 설명: 상속에서 '기본 클래스 포인터'와 '파생 클래스 포인터'를 사용하는 방법은 무엇입니까? May 01, 2024 pm 10:27 PM

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

권장 사항: 우수한 JS 오픈 소스 얼굴 감지 및 인식 프로젝트 권장 사항: 우수한 JS 오픈 소스 얼굴 감지 및 인식 프로젝트 Apr 03, 2024 am 11:55 AM

얼굴 검출 및 인식 기술은 이미 상대적으로 성숙하고 널리 사용되는 기술입니다. 현재 가장 널리 사용되는 인터넷 응용 언어는 JS입니다. 웹 프런트엔드에서 얼굴 감지 및 인식을 구현하는 것은 백엔드 얼굴 인식에 비해 장점과 단점이 있습니다. 장점에는 네트워크 상호 작용 및 실시간 인식이 줄어 사용자 대기 시간이 크게 단축되고 사용자 경험이 향상된다는 단점이 있습니다. 모델 크기에 따라 제한되고 정확도도 제한됩니다. js를 사용하여 웹에서 얼굴 인식을 구현하는 방법은 무엇입니까? 웹에서 얼굴 인식을 구현하려면 JavaScript, HTML, CSS, WebRTC 등 관련 프로그래밍 언어 및 기술에 익숙해야 합니다. 동시에 관련 컴퓨터 비전 및 인공지능 기술도 마스터해야 합니다. 웹 측면의 디자인으로 인해 주목할 가치가 있습니다.

상속과 다형성은 C++의 클래스 결합에 어떤 영향을 미치나요? 상속과 다형성은 C++의 클래스 결합에 어떤 영향을 미치나요? Jun 05, 2024 pm 02:33 PM

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

C++ 함수 상속에 대한 자세한 설명: 상속 오류를 디버깅하는 방법은 무엇입니까? C++ 함수 상속에 대한 자세한 설명: 상속 오류를 디버깅하는 방법은 무엇입니까? May 02, 2024 am 09:54 AM

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

js와 vue의 관계 js와 vue의 관계 Mar 11, 2024 pm 05:21 PM

js와 vue의 관계: 1. 웹 개발의 초석인 JS 2. 프론트엔드 프레임워크로서의 Vue.js의 등장 3. JS와 Vue의 상호 보완적인 관계 4. JS와 Vue의 실제 적용 Vue.

C++ 함수 상속 설명: 언제 상속을 사용하지 않아야 합니까? C++ 함수 상속 설명: 언제 상속을 사용하지 않아야 합니까? May 04, 2024 pm 12:18 PM

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

JS의 AI 시대가 왔습니다! JS의 AI 시대가 왔습니다! Apr 08, 2024 am 09:10 AM

JS-Torch 소개 JS-Torch는 구문이 PyTorch와 매우 유사한 딥 러닝 JavaScript 라이브러리입니다. 여기에는 완전한 기능을 갖춘 텐서 객체(추적된 그라디언트와 함께 사용 가능), 딥 러닝 레이어 및 기능, 자동 미분 엔진이 포함되어 있습니다. JS-Torch는 JavaScript의 딥러닝 연구에 적합하며 딥러닝 개발을 가속화할 수 있는 다양한 편리한 도구와 기능을 제공합니다. Image PyTorch는 Meta 연구팀이 개발하고 유지 관리하는 오픈 소스 딥 러닝 프레임워크입니다. 신경망 모델을 구축하고 훈련하기 위한 풍부한 도구와 라이브러리 세트를 제공합니다. PyTorch는 간단하고 유연하며 사용하기 쉽게 설계되었으며 동적 계산 그래프 기능을 통해

C++ 함수 상속에 대한 자세한 설명: 상속에서 'is-a' 및 'has-a' 관계를 이해하는 방법은 무엇입니까? C++ 함수 상속에 대한 자세한 설명: 상속에서 'is-a' 및 'has-a' 관계를 이해하는 방법은 무엇입니까? May 02, 2024 am 08:18 AM

C++ 함수 상속에 대한 자세한 설명: "is-a"와 "has-a" 사이의 관계를 마스터하세요. 함수 상속이란 무엇인가요? 함수 상속은 파생 클래스에 정의된 메서드를 기본 클래스에 정의된 메서드와 연결하는 C++의 기술입니다. 파생 클래스가 기본 클래스의 메서드에 액세스하고 재정의할 수 있도록 하여 기본 클래스의 기능을 확장합니다. "is-a" 및 "has-a" 관계 함수 상속에서 "is-a" 관계는 파생 클래스가 기본 클래스의 하위 유형, 즉 파생 클래스가 기본 클래스의 특성과 동작을 "상속"함을 의미합니다. 기본 클래스. "has-a" 관계는 파생 클래스에 기본 클래스 개체에 대한 참조 또는 포인터가 포함되어 있음을 의미합니다. 즉, 파생 클래스가 기본 클래스 개체를 "소유"합니다. 구문다음은 함수 상속을 구현하는 방법에 대한 구문입니다. classDerivedClass:pu

See all articles