--- title: class slug: Web/JavaScript/Reference/Statements/class tags: - Classes - Declaration - ECMAScript 2015 - JavaScript - Reference - Statement translation_of: Web/JavaScript/Reference/Statements/class ---
class
선언은 프로토타입 기반 상속을 사용하여, 주어진 이름의 새로운 클래스를 만듭니다.
{{jsxref("Operators/class", "클래스 표현", "", 1)}}을 사용하여 클래스를 정의할 수도 있습니다. 표현식과 달리 선언문으로는 같은 클래스를 다시 선언하면 오류가 발생합니다.
class name [extends] { // class body }
클래스 본문은 엄격 모드에서 실행됩니다. 생성자 속성은 선택 사항입니다..
클래스 선언은 {{jsxref("Statements/function", "함수 선언", "", 0)}}과 달리 {{Glossary("Hoisting", "호이스팅")}}의 대상이 아닙니다.
다음 예제는 우선 Polygon
클래스를 정의하고, Square
라는 이름의 새로운 클래스가 Polygon
을 상속합니다. 생성자 내부의 super()
는 생성자 내에서만, 그리고 {{jsxref("Operators/this", "this")}} 키워드를 사용하기 전에만 쓸 수 있다는 점을 주의하세요.
class Polygon { constructor(height, width) { this.name = 'Polygon'; this.height = height; this.width = width; } } class Square extends Polygon { constructor(length) { super(length, length); this.name = 'Square'; } }
클래스 선언문으로 같은 클래스를 두 번 선언하면 오류가 발생합니다.
class Foo {}; class Foo {}; // Uncaught SyntaxError: Identifier 'Foo' has already been declared
이전에 표현식으로 정의한 경우에도 오류가 발생합니다.
var Foo = class {}; class Foo {}; // Uncaught TypeError: Identifier 'Foo' has already been declared
Specification | Status | Comment |
---|---|---|
{{SpecName('ES2015', '#sec-class-definitions', 'Class definitions')}} | {{Spec2('ES2015')}} | Initial definition. |
{{SpecName('ES2016', '#sec-class-definitions', 'Class definitions')}} | {{Spec2('ES2016')}} | |
{{SpecName('ES2017', '#sec-class-definitions', 'Class definitions')}} | {{Spec2('ES2017')}} | |
{{SpecName('ESDraft', '#sec-class-definitions', 'Class definitions')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.statements.class")}}