에서 객체-지향 프로그래밍 클래스는 확장 가능한 프로그램 코드 템플릿을 만들기 위한 개체를 제공하는 초기 값에 대한 상태(변수 회원)과 구현의 행동(회원 기능 또는 방법).
실제로,우리는 종종을 만들 필요가 많은 개체의 종류,사용자가,또는 상품 또는 어떤 것이다.
생성자 장에서 이미 알고 있듯이 연산자”new”,new function
는 도움이 될 수 있습니다.,
그러나 현대적인 JavaScript,거기에 더 많은 고급스 구축을 소개한 새로운 기능에 대한 유용한 객체 지향 프로그래밍입니다.
“class”syntax
기본적인 구문은 다음과 같습니다.
class MyClass { // class methods constructor() { ... } method1() { ... } method2() { ... } method3() { ... } ...}
다음 사용하는new MyClass()
를 만드는 새로운 개체로 나열된 모든 방법입니다.
constructor()
메소드가 호출에 의해 자동으로new
있습니다,그래서 우리는 초기화 개체 있다.,
예를 들어,
class User { constructor(name) { this.name = name; } sayHi() { alert(this.name); }}// Usage:let user = new User("John");user.sayHi();
경new User("John")
라고:
- 새로운 객체를 만듭니다.
constructor
는 주어진 인수로 실행하여this.name
에 할당합니다.
…그런 다음user.sayHi()
와 같은 객체 메소드를 호출 할 수 있습니다.
발생하는 일반적인 문제는 초심자를 위한 개발자들 사이에 쉼표를 넣어준 방법을 결정하는 구문에 오류가 있습니다.,여기서 표기법은 객체 리터럴과 혼동되지 않습니다. 클래스 내에서 쉼표가 필요하지 않습니다.이 클래스가 무엇인지 알고 싶습니다.이 작업을 수행하려면 어떻게해야합니까? 생각할 수 있듯이 완전히 새로운 언어 수준의 엔티티는 아닙니다.
어떤 마술을 공개하고 수업이 실제로 무엇인지 봅시다. 그러면 많은 복잡한 측면을 이해하는 데 도움이됩니다.자바 스크립트에서 클래스는 일종의 함수입니다.,
다:
class User { constructor(name) { this.name = name; } sayHi() { alert(this.name); }}// proof: User is a functionalert(typeof User); // function
Whatclass User {...}
구성되어 있을 수 있습니다:
- 를 만들라는 기능이
User
,는 것의 결과가 됩 클래스를 선언입니다. 함수 코드는constructor
메소드에서 가져옵니다(그러한 메소드를 작성하지 않으면 비어 있다고 가정). - 는
sayHi
와 같은 클래스 메소드를User.prototype
에 저장합니다.,
후new User
개체를 만들 때,우리는 그것의 방법,그것은 촬영에서 프로토타입 단지 설명대로 장 F. 프로토 타입입니다. 그래서 객체는 클래스 메소드에 액세스 할 수 있습니다.,의class User
선언:
여기에 코드를 성찰하다:
지의 문법 설탕
때로는 사람들이 말하는class
는”의 문법”(는 구문 설계하는 것을 쉽게 읽을 수 있지만,없을 소개하는 새로운 것),수 있기 때문에 우리가 실제로 선언하고 동일하지 않고class
키워드 모:
의 결과는 이 정의에 대해 동일합니다., 그래서,실제로는 이유는class
으로 간주 될 수있는 구문 설탕을 정의 생성자와 함께 그것의 프로토타입 방법이 있습니다.
여전히 중요한 차이점이 있습니다.
-
첫째,기능에 의해 만들어
class
는 레이블에 의해 특별한 내부 속성]:"classConstructor"
. 따라서 수동으로 만드는 것과 완전히 동일하지는 않습니다.언어는 다양한 장소에서 해당 속성을 확인합니다., 예를 들어과는 달리,정기적인 함수 호출해야 합
new
class User { constructor() {}}alert(typeof User); // functionUser(); // Error: Class constructor User cannot be invoked without 'new'
도 의 문자열 표현한 클래스에서는 대부분의 자바스크립트 엔진 시작으로”클래스…”
class User { constructor() {}}alert(User); // class User { ... }
있는 다른 차이,우리가 볼 수 있다는 것이다.
-
클래스 메소드는 열거 할 수 없습니다.,클래스 정의 설정
enumerable
국기를false
에 대한 모든 방법을"prototype"
.객체를 통해for..in
하면 일반적으로 클래스 메소드를 원하지 않기 때문에 좋습니다.나는 이것이 내가 할 수있는 유일한 방법이라고 생각한다.클래스 구조체 내부의 모든 코드는 자동으로 엄격 모드입니다.
게다가,class
구문은 나중에 살펴볼 다른 많은 기능을 제공합니다.,
클래스 식
처럼 기능,클래스 정의될 수 있고 내부에 또 다른 표현,주위에 전달,반환 할당,,등등.
여기를 들어 클래스의 식
let User = class { sayHi() { alert("Hello"); }};
비슷한 이름 지정된 기능을 표현 클래스에 표현할 수 있습니다.,
경우스 식의 이름을,그것은 눈에 보이는 안쪽에스:
우리는 심지어 만들 수 있습니다 클래스는 동적으로”on-demand”은 다음과 같습니다.
필요한 것입/setters
처럼 리터럴체 클래스가 포함될 수 있습이 필요한 것입/세터,계산성 등등.
여기에 대한 예user.name
를 사용하여 구현get/set
기술적으로,이러한 클래스 선언을 만들어 작동현에서User.prototype
.,
계산 이름
여기에 예으로 계산한 메서드 이름을 사용하여 브래킷:
class User { () { alert("Hello"); }}new User().sayHi();
이러한 기능은 기억하기 쉬운,그들의 유사한 리터럴 개체입니다.
등 필드
클래스 필드에 최근에 추가 언어입니다.이전에 우리 클래스에는 메소드 만있었습니다.
“클래스 필드”는 모든 속성을 추가 할 수있는 구문입니다.,
예를 들어,의 추가name
속성을class User
:
class User { name = "John"; sayHi() { alert(`Hello, ${this.name}!`); }}new User().sayHi(); // Hello, John!
그래서,우리는 그냥 쓰기”=”선언에서,그리고 그것.,
중요한 차이점은 클래스의 필드 설정되어 있는지 개별적인지User.prototype
:
class User { name = "John";}let user = new User();alert(user.name); // Johnalert(User.prototype.name); // undefined
우리는 또한 값을 할당을 사용하여 더 복잡한 표정과 기능 전화:
class User { name = prompt("Name, please?", "John");}let user = new User();alert(user.name); // John
기 바인딩 방법으로스 필드
으로 증명에서 제 기능을 바인딩 기능에 자바 스크립트가 동this
., 그것은 호출의 컨텍스트에 따라 다릅니다.
그러면 방법이 주위에 전달라는 다른 상황에서,this
지 않을 참조하여 해당 개체니다.이 문제를 해결하려면 어떻게해야합니까?이 문제를 해결하려면 어떻게해야합니까?
두 가지 방법이 있정에서 설명한 대로 이 장에 바인딩 기능:
- 래퍼 패스-함수,같은
setTimeout(() => button.click(), 1000)
. - 메소드를 객체에 바인딩합니다(예:생성자에서).,
등 필드를 다른 제공,매우 우아한 구문:
클래스 필드click = () => {...}
에서 생성 개체 기준으로,별도의 기능에 대한 각Button
체와 함께this
안에 그것을 참조하는 객체입니다. 우리는 전달할 수 있는button.click
주위에 어디서나 가치의this
항상 올바른 것입니다.
특히 브라우저 환경에서 이벤트 리스너에게 유용합니다.,
요약
기본 클래스 구문을 다음과 같습니다:
MyClass
는 기술적으로 기능(하나는 우리가 제공으로constructor
),는 방법은 구현에 기록되MyClass.prototype
.
다음 장에서는 상속 및 기타 기능을 포함한 클래스에 대해 자세히 알아 보겠습니다.피>