es6에서는 클래스 및 확장 키워드를 사용하여 상속을 구현합니다. class 키워드는 클래스를 선언하기 위해 ES6에서 도입되었으며, 클래스(class)는 extends 키워드를 통해 상속될 수 있어 하위 클래스가 상위 클래스의 속성과 메서드를 상속받을 수 있도록 구문은 "클래스 상위 클래스 이름 {.. .} 클래스 하위 클래스 이름은 상위 클래스 이름 {...};"을 확장합니다.
이 튜토리얼의 운영 환경: 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
클래스의 정적 메서드이고 B
는 A
를 상속합니다. >, 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('static', msg); } myMethod(msg) { console.log('instance', 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

React는 현대적인 프론트 엔드 애플리케이션을 구축하기위한 JavaScript 라이브러리입니다. 1. 구성 요소 및 가상 DOM을 사용하여 성능을 최적화합니다. 2. 구성 요소는 JSX를 사용하여 데이터를 관리하기 위해 정의, 상태 및 속성을 정의합니다. 3. 고리는 수명주기 관리를 단순화합니다. 4. ContextApi를 사용하여 글로벌 상태를 관리하십시오. 5. 일반적인 오류는 디버깅 상태 업데이트 및 수명주기가 필요합니다. 6. 최적화 기술에는 메모 화, 코드 분할 및 가상 스크롤이 포함됩니다.

React의 미래는 궁극적 인 구성 요소 개발, 성능 최적화 및 다른 기술 스택과의 깊은 통합에 중점을 둘 것입니다. 1) RECT는 구성 요소의 생성 및 관리를 더욱 단순화하고 궁극적 인 구성 요소 개발을 촉진합니다. 2) 성능 최적화는 특히 대규모 응용 프로그램에서 초점이됩니다. 3) React는 개발 경험을 향상시키기 위해 GraphQL 및 TypeScript와 같은 기술과 깊이 통합 될 것입니다.

React는 사용자 인터페이스를 구축하기위한 JavaScript 라이브러리입니다. 핵심 아이디어는 구성 요소화를 통해 UI를 구축하는 것입니다. 1. 구성 요소는 UI 논리 및 스타일을 캡슐화하는 반응의 기본 단위입니다. 2. 가상 DOM 및 상태 관리는 구성 요소 작업의 핵심이며 State는 SetState를 통해 업데이트됩니다. 3. 수명주기에는 마운트, 업데이트 및 제거의 세 단계가 포함됩니다. 성능을 합리적으로 사용하여 최적화 할 수 있습니다. 4. usestate 및 contextapi를 사용하여 상태를 관리하고 구성 요소 재사용 성 및 글로벌 상태 관리를 개선하십시오. 5. 일반적인 오류에는 부적절한 상태 업데이트 및 성능 문제가 포함되며, 이는 ReactDevTools를 통해 디버깅 할 수 있습니다. 6. 성능 최적화 제안에는 메모 사용, 불필요한 재 렌더링 방지 및 사용이 포함됩니다.

JSX 구문 사용 : JSX 구문을 사용하여 JSX 구조를 사용하여 HTML 구조를 JavaScript 코드에 포함시키고 컴파일 후 DOM을 작동시킵니다. 구성 요소는 HTML과 결합됩니다. React 구성 요소는 소품을 통해 데이터를 전달하고 HTML 컨텐츠를 동적으로 생성합니다. 데이터 흐름 관리 : React의 데이터 흐름은 일방 통행이며, 부모 구성 요소에서 자식 구성 요소로 전달되어 이름을 인사말로 전달하는 앱 구성 요소와 같이 데이터 흐름을 제어 할 수 있도록합니다. 기본 사용 예 :지도 함수를 사용하여 목록을 렌더링하려면 과일 목록 렌더링과 같은 주요 속성을 추가해야합니다. 고급 사용 예 : Usestate 후크를 사용하여 상태를 관리하고 역학을 구현합니다.

React는 사용자 인터페이스를 구축하는 효율적이고 유연한 방법을 제공하기 때문에 단일 페이지 응용 프로그램 (SPA)을 구축하는 데 선호되는 도구입니다. 1) 구성 요소 개발 : 복잡한 UI를 독립적이고 재사용 가능한 부품으로 분할하여 유지 가능성과 재사용 성을 향상시킵니다. 2) 가상 DOM : 가상 DOM과 실제 DOM의 차이를 비교하여 렌더링 성능을 최적화합니다. 3) 상태 관리 : 데이터 일관성 및 예측 가능성을 보장하기 위해 상태 및 속성을 통한 데이터 흐름을 관리합니다.

React는 Meta가 사용자 인터페이스를 구축하기 위해 개발 한 JavaScript 라이브러리이며 핵심은 구성 요소 개발 및 가상 DOM 기술입니다. 1. 구성 요소 및 상태 관리 : React는 구성 요소 (기능 또는 클래스) 및 후크 (예 : usestate)를 통해 상태를 관리하여 코드 재사용 및 유지 보수를 개선합니다. 2. 가상 DOM 및 성능 최적화 : 가상 DOM을 통해 실제 DOM을 효율적으로 업데이트하여 성능을 향상시킵니다. 3. 수명주기 및 후크 : 후크 (예 : 사용률) 기능 구성 요소가 수명주기를 관리하고 부작용 작업을 수행 할 수 있도록합니다. 4. 사용 예 : 기본 Helloworld 구성 요소에서 고급 글로벌 주 관리 (Usecontext 및

React Ecosystem에는 주정부 관리 라이브러리 (예 : Redux), 라우팅 라이브러리 (예 : Reactrouter), UI 구성 요소 라이브러리 (예 : 재료 -UI), 테스트 도구 (예 : Jest) 및 Webpack과 같은 빌드 도구 (예 : Webpack)가 포함됩니다. 이러한 도구는 개발자가 애플리케이션을 효율적으로 개발하고 유지하고 코드 품질 및 개발 효율성을 향상시킬 수 있도록 함께 작동합니다.

React는 사용자 인터페이스를 구축하기 위해 Facebook에서 개발 한 JavaScript 라이브러리입니다. 1. 구성 요소 및 가상 DOM 기술을 채택하여 UI 개발의 효율성과 성능을 향상시킵니다. 2. RECT의 핵심 개념에는 구성 요소화, 상태 관리 (예 : usestate 및 useeffect) 및 가상 DOM의 작동 원리가 포함됩니다. 3. 실제 응용 분야에서 React는 기본 구성 요소 렌더링에서 고급 비동기 데이터 처리에 이르기까지 지원됩니다. 4. 주요 속성 추가 또는 잘못된 상태 업데이트를 잊어 버린 것과 같은 일반적인 오류는 ReactDevTools 및 Logs를 통해 디버깅 할 수 있습니다. 5. 성능 최적화 및 모범 사례에는 React.Memo, 코드 세분화 및 코드를 읽기 쉽게 유지하고 신뢰성을 유지하는 것이 포함됩니다.


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

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

Dreamweaver Mac版
시각적 웹 개발 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

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

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.
