목차
ES6 클래스 상속
하위 클래스 생성자가 super()를 호출해야 하는 이유는 무엇인가요?
웹 프론트엔드 프런트엔드 Q&A es6에서 상속을 구현하는 데 사용되는 것

es6에서 상속을 구현하는 데 사용되는 것

Feb 14, 2023 pm 01:56 PM
es6 프런트 엔드 상속하다

es6에서는 클래스 및 확장 키워드를 사용하여 상속을 구현합니다. class 키워드는 클래스를 선언하기 위해 ES6에서 도입되었으며, 클래스(class)는 extends 키워드를 통해 상속될 수 있어 하위 클래스가 상위 클래스의 속성과 메서드를 상속받을 수 있도록 구문은 "클래스 상위 클래스 이름 {.. .} 클래스 하위 클래스 이름은 상위 클래스 이름 {...};"을 확장합니다.

es6에서 상속을 구현하는 데 사용되는 것

이 튜토리얼의 운영 환경: Windows 7 시스템, ECMAScript 버전 6, Dell G3 컴퓨터.

es6에서는 클래스 키워드와 확장 키워드를 사용하여 상속을 구현할 수 있습니다.

ES6 클래스 상속

1. 소개

클래스는 확장 키워드를 통해 상속을 달성할 수 있으므로 하위 클래스가 상위 클래스의 속성과 메서드를 상속받을 수 있습니다. 이는 프로토타입 체인을 수정하여 ES5의 상속을 구현하는 것보다 훨씬 더 명확하고 편리합니다.

//父类
class Point {
 ...
}
//子类
class ColorPoint extends Point {
	constructor(x, y, color) {
		super(x, y);
		this.color = color;
	}
	toString() {
		return this.color + '' + super.toString(); // 调用父类的toString方法
	}
}
로그인 후 복사

위 코드에서 super 키워드는 생성자 메소드와 toString 메소드 모두에 나타납니다. 여기서 Super는 상위 클래스의 생성자를 나타내며 상위 클래스의 새 인스턴스 객체를 생성하는 데 사용됩니다.

ES6에서는 하위 클래스가 생성자 메서드에서 super()를 호출해야 한다고 규정합니다. 그렇지 않으면 오류가 보고됩니다. 이는 상위 클래스와 동일한 인스턴스 속성을 얻으려면 하위 클래스의 자체 this 객체를 먼저 상위 클래스의 생성자를 통해 형성해야 하기 때문입니다. . 및 메서드를 추가한 다음 하위 클래스의 자체 인스턴스 속성과 메서드를 추가합니다.

하위 클래스 생성자가 super()를 호출해야 하는 이유는 무엇인가요?

이것은 ES5의 상속 메커니즘에서 독립 하위 클래스의 인스턴스 객체가 먼저 생성된 다음 상위 클래스의 메서드가 이 객체에 추가되기 때문입니다. 즉, "인스턴스 우선, 상속 마지막"입니다. 상속 메커니즘은 먼저 상위 클래스의 속성과 메소드를 빈 객체에 추가한 다음 해당 객체를 하위 클래스의 인스턴스로 사용하는 것, 즉 "상속 우선, 인스턴스 마지막"입니다.

이는 새 하위 클래스 인스턴스가 생성될 때마다 상위 클래스의 생성자가 한 번씩 실행되어야 한다는 의미입니다.

class Foo {
	constructor() {
		console.log(1);
	}
}

class Bar extends Foo {
	constructor() {
		super();
		console.log(2);
	}
}

const bar = new Bar(); // 1 2
로그인 후 복사

위 코드에서 하위 클래스 Bar가 새 인스턴스를 생성하면 1과 2가 출력됩니다. 인수 클래스 구성 함수가 super()를 호출하면 상위 클래스 생성자가 한 번 실행됩니다. 이 키워드는 하위 클래스의 생성자에서 super를 호출한 후에만 사용할 수 있습니다. 그렇지 않으면 오류가 보고됩니다. 이는 하위 클래스 인스턴스의 생성이 먼저 상위 클래스의 상속을 완료해야 하기 때문입니다. 오직 슈퍼 메소드만이 하위 클래스 인스턴스가 상위 클래스를 상속하도록 허용할 수 있습니다.

class Point {
	constructor(x, y) {
		this.x = x;
		this.y = y;
	}
}

class ColorPoint extends Point {
	constructor(x, y, color) {
		this.color = color;
		super(x, y);
		this.color = color;
	}
}"
로그인 후 복사

하위 클래스가 생성자 메서드를 정의하지 않으면 이 메서드가 기본적으로 추가되며 그 안에서 super가 호출됩니다. 즉, 명시적으로 정의되었는지 여부에 관계없이 모든 하위 클래스에는 생성자 메서드가 있습니다. .

class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
}
class ColorPoint extends Point {
}

let cp = new ColorPoint(25, 8);
console.log(cp); //{x: 25, y: 8}

class ColorPoint extends Point {
  constructor(...args) {
    super(...args);
  }
}

let cp = new ColorPoint(25, 8);
console.log(cp); //{x: 25, y: 8}
로그인 후 복사

2. 속성 및 비공개 메소드의 비공개 상속

비공개 속성 및 메소드를 제외하고 상위 클래스의 모든 속성과 메소드는 하위 클래스에 상속됩니다. 하위 클래스는 상위 클래스의 전용 속성을 상속할 수 없습니다. 또는 전용 속성은 자신이 정의된 클래스에서만 사용할 수 있습니다.

class Foo {
  #p = 1;
  #m() {
    console.log('hello');
  }
}

class Bar extends Foo {
  constructor() {
    super();
    console.log(this.#p); // 报错
    this.#m(); // 报错
  }
}
로그인 후 복사

위의 예에서 하위 클래스 Bar가 상위 클래스 Foo의 전용 속성이나 전용 메서드를 호출하면 오류가 보고됩니다.

부모 클래스가 전용 속성에 대한 읽기 및 쓰기 메서드를 정의하는 경우 하위 클래스는 이러한 메서드를 통해 전용 속성을 읽고 쓸 수 있습니다.

class Foo {
  #p = 1;
  getP() {
    return this.#p;
  }
}

class Bar extends Foo {
  constructor() {
    super();
    console.log(this.getP()); // 1
  }
}
로그인 후 복사

3. 정적 속성 및 메서드 상속

상위 클래스의 정적 속성 및 정적 메서드도 하위 클래스에서 상속됩니다.

class A {
  static hello() {
    console.log('hello world');
  }
}

class B extends A {
}

B.hello()  // hello world
로그인 후 복사

위 코드에서 hello()A 클래스의 정적 메서드이고 BA</code를 상속합니다. >, <code>A의 정적 메서드도 상속합니다. hello()A类的静态方法,B继承A,也继承了A的静态方法。

注意,静态属性是通过浅拷贝实现继承的,如果继承的属性是原始数据类型,子类中操作继承的静态属性不会影响到父类,但如果继承的属性是一个对象,那么子类修改这个属性会印象到父类

class C {
	static foo = 100;
}

class D extends C {
	constructor() {
		super();
		D.foo--;
	}
}

const d = new D();
C.foo; // 100
D.foo;  // 99

class A {
	static foo = { n: 100 };
}

class B extends A {
	constructor() {
		super();
		B.foo.n--;
	}
}

const b = new B();
B.foo.n // 99
A.foo.n  // 99
로그인 후 복사

4.Object.getPrototypeOf()

Object.getPrototypeOf()

정적 속성은 얕은 복사를 통해 상속된다는 점에 유의하세요. 상속된 속성이 기본 데이터 유형인 경우 하위 클래스에서 상속된 정적 속성의 작업은 상위 클래스에 영향을 미치지 않지만 상속된 속성이 객체인 경우에는 하위 클래스 이 속성을 수정하면 상위 클래스에 좋은 인상을 줄 것입니다

class Point { /*...*/ }

class ColorPoint extends Point { /*...*/ }

Object.getPrototypeOf(ColorPoint) === Point
// true
로그인 후 복사

4.Object.getPrototypeOf()

Object.getPrototypeOf() 메소드를 사용하여 하위 클래스에서 상위 클래스를 가져올 수 있습니다.

class A {
	constructor() {
    console.log(new.target.name);
  }
}

class B extends A {
	constructor() {
		super();
	}
}

new A(); // A
new B(); // B
로그인 후 복사

따라서 이 방법을 사용하여 클래스가 다른 클래스를 상속하는지 여부를 확인할 수 있습니다.

5. super 키워드

super 키워드는 함수 또는 객체로 사용될 수 있습니다.

첫 번째 경우, super가 함수로 호출되면 상위 클래스의 생성자를 나타냅니다. super를 호출하는 기능은 하위 클래스의 this 객체를 형성하고 부모 클래스의 인스턴스 속성과 메서드를 이 객체에 배치하는 것입니다.

class A {
	p() {
    return 2;
  }
}

class B extends A {
  constructor() {
    super();
    console.log(super.p()); // 2
  }
}

let b = new B();
로그인 후 복사

두 번째 경우, super가 객체로 사용될 때 일반 메소드에서는 상위 클래스의 프로토타입 객체를 가리키고 정적 메소드에서는 상위 클래스를 가리킵니다. 🎜
class A {
	constructor() {
		this.p = 2;
	}
}

class B extends A {
	get m() {
		return spuer.p;
	}
}

let b = new B();
b.m // undefined
로그인 후 복사
🎜위 코드에서 서브클래스 B의 super.p()는 super를 객체로 사용합니다. 이때 일반 객체의 super는 A.prototype을 가리키고, super.p()는 A.prototype과 동일합니다. .피(). 🎜🎜super는 상위 클래스의 프로토타입 객체를 가리키므로 상위 클래스 인스턴스에 정의된 메서드나 속성은 super를 통해 호출할 수 없습니다. 아래와 같이 🎜
class A {};
A.prototype.x = 2;

class B extends A {
	constructor() {
		super();
		console.log(super.x);
	}
}

let b = new B();
로그인 후 복사
🎜이 문제를 해결하려면 상위 클래스의 프로토타입 객체에 속성을 정의하면 됩니다.🎜
class A {
	constructor() {
		this.x = 1;
	}
	print() {
		console.log(this.x);
	}
}

class B extends A {
	constructor() {
		super();
		this.x = 2;
	}
	m() {
		super.print();
	}
}

let b = new B();
b.m(); // 2
로그인 후 복사
로그인 후 복사
🎜ES6에서는 하위 클래스의 일반적인 메소드에서 super를 통해 상위 클래스의 메소드를 호출할 때 다음과 같이 규정하고 있습니다. , 메서드 내부의 this는 현재 하위 클래스 인스턴스를 가리킵니다🎜
class A {
	constructor() {
		this.x = 1;
	}
	print() {
		console.log(this.x);
	}
}

class B extends A {
	constructor() {
		super();
		this.x = 2;
	}
	m() {
		super.print();
	}
}

let b = new B();
b.m(); // 2
로그인 후 복사
로그인 후 복사

上面代码中,super.print()调用的是A.prototype.print(),但是此时方法内部的this指向是子类B的实例,所以输出2。

由于this指向的是子类实例,所有如果通过super对某个属性赋值,这时super就是this,赋值的属性会变成子类实例的属性

class A {
	constructor() {
		this.x = 1;
	}
}

class B extends A {
	constructor() {
		super();
		this.x = 2;
		super.x = 3;
		console.log(super.x); //undefind
		console.log(this.x); // 3
	}
}
로그인 후 복사

上面代码中,super.x赋值为3,这时等同于对this.x赋值为3。而当读取super.x 的时候,读的是A.prototype.x,所以返回undefined

如果super作为对象,用在静态方法之中,这时super将指向父类,而不是父类的原型对象。

class Parent {
	static myMethod(msg) {
		console.log(&#39;static&#39;, msg);
	}

	myMethod(msg) {
		console.log(&#39;instance&#39;, msg);
	}
}

class Children extends Parent {
	static myMethod(msg) {
		super.myMthod(msg);
	}

	myMethod(msg) {
    super.myMethod(msg);
  }
}

Child.myMethod(1); // static 1

var child = new Child();
child.myMethod(2); // instance 2
로그인 후 복사

上面代码中,super在静态方法之中指向父类,在普通方法之中指向父类的原型对象。

另外,在子类的静态方法中通过super调用父类的方法时,方法内部的this指向当前的子类,而不是子类的实例

class A {
	constructor() {
    this.x = 1;
  }
  static print() {
    console.log(this.x);
  }
}

class B extends A {
  constructor() {
    super();
    this.x = 2;
  }
  static m() {
    super.print();
  }
}

B.x = 3;
B.m() // 3
로그인 후 복사

在静态方法m中,super.print指向父类的静态方法,到那时this指向的是类B,而不是B的实例。

【推荐学习:javascript高级教程

위 내용은 es6에서 상속을 구현하는 데 사용되는 것의 상세 내용입니다. 자세한 내용은 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를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++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

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

PHP와 Vue: 프런트엔드 개발 도구의 완벽한 조합 PHP와 Vue: 프런트엔드 개발 도구의 완벽한 조합 Mar 16, 2024 pm 12:09 PM

PHP와 Vue: 프론트엔드 개발 도구의 완벽한 조합 오늘날 인터넷이 빠르게 발전하는 시대에 프론트엔드 개발은 점점 더 중요해지고 있습니다. 사용자가 웹 사이트 및 애플리케이션 경험에 대한 요구 사항이 점점 더 높아짐에 따라 프런트 엔드 개발자는 보다 효율적이고 유연한 도구를 사용하여 반응형 및 대화형 인터페이스를 만들어야 합니다. 프론트엔드 개발 분야의 두 가지 중요한 기술인 PHP와 Vue.js는 함께 사용하면 완벽한 도구라고 볼 수 있습니다. 이 기사에서는 독자가 이 두 가지를 더 잘 이해하고 적용할 수 있도록 PHP와 Vue의 조합과 자세한 코드 예제를 살펴보겠습니다.

프론트엔드 면접관이 자주 묻는 질문 프론트엔드 면접관이 자주 묻는 질문 Mar 19, 2024 pm 02:24 PM

프론트엔드 개발 인터뷰에서 일반적인 질문은 HTML/CSS 기초, JavaScript 기초, 프레임워크 및 라이브러리, 프로젝트 경험, 알고리즘 및 데이터 구조, 성능 최적화, 크로스 도메인 요청, 프론트엔드 엔지니어링, 디자인 패턴, 새로운 기술 및 트렌드. 면접관 질문은 후보자의 기술적 능력, 프로젝트 경험, 업계 동향에 대한 이해를 평가하기 위해 고안되었습니다. 따라서 지원자는 자신의 능력과 전문성을 입증할 수 있도록 해당 분야에 대한 충분한 준비를 갖추어야 합니다.

Go 언어 프런트엔드 기술 탐색: 프런트엔드 개발을 위한 새로운 비전 Go 언어 프런트엔드 기술 탐색: 프런트엔드 개발을 위한 새로운 비전 Mar 28, 2024 pm 01:06 PM

빠르고 효율적인 프로그래밍 언어인 Go 언어는 백엔드 개발 분야에서 널리 사용됩니다. 그러나 Go 언어를 프런트엔드 개발과 연관시키는 사람은 거의 없습니다. 실제로 프런트엔드 개발에 Go 언어를 사용하면 효율성이 향상될 뿐만 아니라 개발자에게 새로운 지평을 열어줄 수도 있습니다. 이 기사에서는 프런트엔드 개발에 Go 언어를 사용할 수 있는 가능성을 살펴보고 독자가 이 영역을 더 잘 이해할 수 있도록 구체적인 코드 예제를 제공합니다. 전통적인 프런트엔드 개발에서는 사용자 인터페이스를 구축하기 위해 JavaScript, HTML, CSS를 사용하는 경우가 많습니다.

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

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

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

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

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

Golang과 프런트엔드 기술의 결합: Golang이 프런트엔드 분야에서 어떤 역할을 하는지 살펴보세요. Golang과 프런트엔드 기술의 결합: Golang이 프런트엔드 분야에서 어떤 역할을 하는지 살펴보세요. Mar 19, 2024 pm 06:15 PM

Golang과 프런트엔드 기술의 결합: Golang이 프런트엔드 분야에서 어떤 역할을 하는지 살펴보려면 구체적인 코드 예제가 필요합니다. 인터넷과 모바일 애플리케이션의 급속한 발전으로 인해 프런트엔드 기술이 점점 더 중요해지고 있습니다. 이 분야에서는 강력한 백엔드 프로그래밍 언어인 Golang도 중요한 역할을 할 수 있습니다. 이 기사에서는 Golang이 프런트엔드 기술과 어떻게 결합되는지 살펴보고 특정 코드 예제를 통해 프런트엔드 분야에서의 잠재력을 보여줍니다. 프론트엔드 분야에서 Golang의 역할은 효율적이고 간결하며 배우기 쉬운 것입니다.

See all articles