Baseline Widely available *
Classë ê°ì²´ë¥¼ ìì±í기 ìí í í릿ì ëë¤. í´ëì¤ë ë°ì´í°ì ì´ë¥¼ ì¡°ìíë ì½ë를 íëë¡ ì¶ìíí©ëë¤. JavaScriptìì í´ëì¤ë íë¡í íì ì ì´ì©í´ì ë§ë¤ì´ì¡ì§ë§ ES5ì í´ëì¤ ì미ìë ë¤ë¥¸ 문ë²ê³¼ ì미를 ê°ì§ëë¤.
Class ì ìClassë ì¬ì¤ "í¹ë³í í¨ì"ì ëë¤. í¨ì를 í¨ì ííìê³¼ í¨ì ì ì¸ì¼ë¡ ì ìí ì ìë¯ì´ class 문ë²ë class ííì and class ì ì¸ ë ê°ì§ ë°©ë²ì ì ê³µí©ëë¤.
Class ì ì¸Class를 ì ìíë í ê°ì§ ë°©ë²ì class ì ì¸ì ì´ì©íë ê²ì
ëë¤. class를 ì ì¸í기 ìí´ìë í´ëì¤ì ì´ë¦(ì¬ê¸°ì "Rectangle")ê³¼ í¨ê» class
í¤ìë를 ì¬ì©í´ì¼ í©ëë¤.
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
Hoisting
í¨ì ì ì¸ê³¼ í´ëì¤ ì ì¸ì ì¤ìí ì°¨ì´ì ì í¨ìì ê²½ì° ì ìí기 í기 ì ì í¸ì¶í ì ìì§ë§, í´ëì¤ë ë°ëì ì ìí ë¤ì ì¬ì©í ì ìë¤ë ì ì
ëë¤. ë¤ì ì½ëë ReferenceError
를 ëì§ ê²ì
ëë¤.
const p = new Rectangle(); // ReferenceError
class Rectangle {}
ìì¸ê° ë°ìíë ì´ì ë í´ëì¤ê° í¸ì´ì¤í ë ë ì´ê¸°íë ëì§ ì기 ë문ì ëë¤.
Class ííìClass ííìì class를 ì ìíë ë ë¤ë¥¸ ë°©ë²ì
ëë¤. Class ííìì ì´ë¦ì ê°ì§ ìë ìê³ , ê°ì§ ìì ìë ììµëë¤. ì´ë¦ì ê°ì§ class ííìì ì´ë¦ì í´ëì¤ bodyì local scopeì íí´ ì í¨í©ëë¤. (íì§ë§, í´ëì¤ì (ì¸ì¤í´ì¤ ì´ë¦ì´ ìë) name
ìì±ì íµí´ ì°¾ì ì ììµëë¤).
// unnamed
let Rectangle = class {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
console.log(Rectangle.name);
// ì¶ë ¥: "Rectangle"
// named
let Rectangle = class Rectangle2 {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
console.log(Rectangle.name);
// ì¶ë ¥: "Rectangle2"
ì°¸ê³ : í´ëì¤ ííììë Class ì ì¸ ì¹ì ì ì¤ëª ë ê²ê³¼ ëì¼í í¸ì´ì¤í ì íì´ ì ì©ë©ëë¤.
Class body ì ë©ìë ì ìClass bodyë ì¤ê´í¸ {}
ë¡ ë¬¶ì¬ ìë ì쪽 ë¶ë¶ì
ëë¤. ì´ê³³ì ì¬ë¬ë¶ì´ ë©ìëë constructorì ê°ì class 멤ë²ë¥¼ ì ìí ê³³ì
ëë¤.
í´ëì¤ì 본문(body)ì strict modeìì ì¤íë©ëë¤. ì¦, ì¬ê¸°ì ì í ì½ëë ì±ë¥ í¥ìì ìí´ ë ì격í 문ë²ì´ ì ì©ë©ëë¤. ê·¸ë ì§ ìì¼ë©´, ì¡°ì©í ì¤ë¥ê° ë°ìí ì ììµëë¤. í¹ì í¤ìëë 미ëì ECMAScript ë²ì ì©ì¼ë¡ ìì½ë©ëë¤.
Constructor (ìì±ì)constructor ë©ìëë class
ë¡ ìì±ë ê°ì²´ë¥¼ ìì±íê³ ì´ê¸°íí기 ìí í¹ìí ë©ìëì
ëë¤. "constructor" ë¼ë ì´ë¦ì ê°ì§ í¹ìí ë©ìëë í´ëì¤ ìì í ê°ë§ ì¡´ì¬í ì ììµëë¤. ë§ì½ í´ëì¤ì ì¬ë¬ ê°ì constructor
ë©ìëê° ì¡´ì¬íë©´ SyntaxError
ê° ë°ìí ê²ì
ëë¤.
constructorë ë¶ëª¨ í´ëì¤ì constructor를 í¸ì¶í기 ìí´ super
í¤ìë를 ì¬ì©í ì ììµëë¤.
ë©ìë ì ìë 참조í´ë³´ì¸ì.
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
// Getter
get area() {
return this.calcArea();
}
// ë©ìë
calcArea() {
return this.height * this.width;
}
}
const square = new Rectangle(10, 10);
console.log(square.area); // 100
ì ì ë©ìëì ìì±
static í¤ìëë í´ëì¤ë¥¼ ìí ì ì (static) ë©ìë를 ì ìí©ëë¤. ì ì ë©ìëë í´ëì¤ì ì¸ì¤í´ì¤í(instantiating) ìì´ í¸ì¶ëë©°, í´ëì¤ì ì¸ì¤í´ì¤ììë í¸ì¶í ì ììµëë¤. ì ì ë©ìëë ì´í리ì¼ì´ì (application)ì ìí ì í¸ë¦¬í°(utility) í¨ì를 ìì±íë ë° ì£¼ë¡ ì¬ì©ë©ëë¤. ë°ë©´, ì ì ìì±ì ìºì, ê³ ì íê²½ì¤ì ëë ì¸ì¤í´ì¤ ê°ì ë³µì í íìê° ìë 기í ë°ì´í°ì ì ì©í©ëë¤.
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
static displayName = "Point";
static distance(a, b) {
const dx = a.x - b.x;
const dy = a.y - b.y;
return Math.hypot(dx, dy);
}
}
const p1 = new Point(5, 5);
const p2 = new Point(10, 10);
p1.displayName; // undefined
p1.distance; // undefined
p2.displayName; // undefined
p2.distance; // undefined
console.log(Point.displayName); // "Point"
console.log(Point.distance(p1, p2)); // 7.0710678118654755
íë¡í íì
ë° ì ì ë©ìë를 ì¬ì©í this
ë°ì¸ë©
ë©ìë를 ë³ìì í ë¹ í ë¤ì í¸ì¶íë ê²ê³¼ ê°ì´, ì ì ë©ìëë íë¡í íì
ë©ìëê° this
ê° ìì´ í¸ì¶ë ë, this
ê°ì ë©ìë ììì undefined
ê° ë©ëë¤. ì´ ëìì "use strict"
ëª
ë ¹ì´ ìì´ë ê°ì ë°©ìì¼ë¡ ëìíëë°, class
ë¬¸ë² ìì ìë ì½ëë íì strict mode ë¡ ì¤íë기 ë문ì
ëë¤.
class Animal {
speak() {
return this;
}
static eat() {
return this;
}
}
let obj = new Animal();
obj.speak(); // the Animal object
let speak = obj.speak;
speak(); // undefined
Animal.eat(); // class Animal
let eat = Animal.eat;
eat(); // undefined
ìì ìì±ë ì½ë를 ì íµì ë°©ìì í¨ì기ë°ì nonâstrict mode 구문ì¼ë¡ ì¬ìì±íë©´, this
ë©ìë í¸ì¶ì 기본ì ì¼ë¡ ì ì ê°ì²´ì¸ ì´ê¸° this
ê°ì ìëì¼ë¡ ë°ì¸ë© ë©ëë¤. Strict modeììë ìë ë°ì¸ë©ì´ ë°ìíì§ ììµëë¤; this
ê°ì ì ë¬ë ëë¡ ì ì§ë©ëë¤.
function Animal() {}
Animal.prototype.speak = function () {
return this;
};
Animal.eat = function () {
return this;
};
let obj = new Animal();
let speak = obj.speak;
speak(); // global object (in nonâstrict mode)
let eat = Animal.eat;
eat(); // global object (in non-strict mode)
ì¸ì¤í´ì¤ ìì±
ì¸ì¤í´ì¤ ìì±ì ë°ëì í´ëì¤ ë©ìë ë´ì ì ìëì´ì¼ í©ëë¤:
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
ì ì (í´ëì¤ì¬ì´ë) ìì±ê³¼ íë¡í íì ë°ì´í° ìì±ì ë°ëì í´ëì¤ ì ì¸ë¶ ë°ê¹¥ìª½ìì ì ìëì´ì¼ í©ëë¤.
Rectangle.staticWidth = 20;
Rectangle.prototype.prototypeWidth = 25;
Field ì ì¸
ê²½ê³ : publicê³¼ private íë ì ì¸ì JavaScript íì¤í ììíì ì¤íì ê¸°ë¥ (stage 3) TC39 ë¡ ì ìëì´ììµëë¤. íì¬ ì´ë¥¼ ì§ìíë ë¸ë¼ì°ì ¸ë ì íì ì¸ ìíì ëë¤ë§, Babel ê³¼ ê°ì build ìì¤í ì ì¬ì©íë¤ë©´ ì´ ê¸°ë¥ì ì¬ì©í´ë³¼ ì ììµëë¤.
Public íë ì ì¸JavaScriptì íë ì ì¸ ë¬¸ë²ì ì¬ì©í´ì ìì ìì ë ìëì ê°ì´ ë¤ì ì°ì¬ì§ ì ììµëë¤.
class Rectangle {
height = 0;
width;
constructor(height, width) {
this.height = height;
this.width = width;
}
}
íë를 먼ì ì ì¸í¨ì¼ë¡ì í´ëì¤ ì ìë self-documentingì ê°ê¹ìì¡ê³ íëë ì¸ì ë ì¡´ì¬íë ìíê° ë©ëë¤.
ìì ììì ë´¤ë¯ì´ íë ì ì¸ì 기본 ê°ê³¼ ê°ì´ ì ì¸ë ìë ììµëë¤.
ìì¸í ë´ì©ì public class fields를 참조íì¸ì.
Private íë ì ì¸private íë를 ì¬ì©íë©´ ìëì ê°ì´ ìì 를 ê°ì í ì ììµëë¤.
class Rectangle {
#height = 0;
#width;
constructor(height, width) {
this.#height = height;
this.#width = width;
}
}
í´ëì¤ì ë°ê¹¥ìì private íë를 ì ê·¼íë ¤ê³ íë©´ ìë¬ê° ë°ìí©ëë¤. privateíëë í´ëì¤ ë´ë¶ììë§ ì½ê³ ì°ê¸°ê° ê°ë¥í©ëë¤. í´ëì¤ ì¸ë¶ìì ë³´ì´ì§ ìëë¡ ì ìíìì¼ë¯ë¡ í´ëì¤ê° ë²ì ¼ì ëë©´ì ë´ë¶ 구íì´ ë°ëëë¼ë í´ëì¤ ì¬ì©ì ì ì¥ììë ì´ì ìë¬´ë° ìíì ë°ì§ ìëë¡ í ì ììµëë¤.
ì°¸ê³ : Private íëë ì¬ì©ì ì ì ì¸ëì´ì¼ í©ëë¤.
ì¼ë°ì ì¸ íë¡í¼í°ìë ë¤ë¥´ê² private íëë ê°ì í ë¹íë©´ì ë§ë¤ì´ì§ ì ììµëë¤.
ìì¸í ë´ì©ì private class fields를 참조íì¸ì.
extends
를 íµí í´ëì¤ ìì(sub classing)
extends
í¤ìëë í´ëì¤ ì ì¸ì´ë í´ëì¤ ííììì ë¤ë¥¸ í´ëì¤ì ìì í´ëì¤ë¥¼ ìì±í기 ìí´ ì¬ì©ë©ëë¤.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Dog extends Animal {
constructor(name) {
super(name); // super class ìì±ì를 í¸ì¶íì¬ name 매ê°ë³ì ì ë¬
}
speak() {
console.log(`${this.name} barks.`);
}
}
let d = new Dog("Mitzie");
d.speak(); // Mitzie barks.
subclassì constructorê° ìë¤ë©´, "this"를 ì¬ì©í기 ì ì ê°ì¥ 먼ì super()를 í¸ì¶í´ì¼ í©ëë¤.
ëí es5ìì ì¬ì©ëë ì íµì ì¸ í¨ì 기ë°ì í´ëì¤ë¥¼ íµíì¬ íì¥í ìë ììµëë¤.
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function () {
console.log(`${this.name} makes a noise.`);
};
class Dog extends Animal {
speak() {
console.log(`${this.name} barks.`);
}
}
let d = new Dog("Mitzie");
d.speak(); // Mitzie barks.
// ì ì¬í ë©ìëì ê²½ì°, ììì ë©ìëê° ë¶ëª¨ì ë©ìëë³´ë¤ ì°ì í©ëë¤
í´ëì¤ë ìì±ìê° ìë ê°ì²´(non-constructible)ì íì¥í ì ììµëë¤. ë§ì½ 기존ì ìì±ìê° ìë ê°ì²´ì íì¥íê³ ì¶ë¤ë©´, ì´ ë©ìë를 ì¬ì©íì¸ì. Object.setPrototypeOf()
:
const Animal = {
speak() {
console.log(`${this.name} makes a noise.`);
},
};
class Dog {
constructor(name) {
this.name = name;
}
}
// ì´ ìì
ì ìííì§ ìì¼ë©´ speak를 í¸ì¶í ë TypeErrorê° ë°ìí©ëë¤
Object.setPrototypeOf(Dog.prototype, Animal);
let d = new Dog("Mitzie");
d.speak(); // Mitzie makes a noise.
Species
ë°°ì´ì ìì ë°ì MyArray í´ëì¤ìì Array
Object를 ë°ííê³ ì¶ì ìë ìì ê²ì
ëë¤. ê·¸ë´ë Species í¨í´ì 기본 ìì±ì를 ë®ì´ì°ëë¡ í´ì¤ëë¤.
ì를 ë¤ì´, map()
ê³¼ ê°ì 기본 ìì±ì를 ë°ííë ë©ìë를 ì¬ì©í ë ì´ ë©ìëê° MyArray ê°ì²´ ëì Array
ê°ì²´ê° ë°ííëë¡ íê³ ì¶ì ê²ì
ëë¤. Symbol.species
ì¬ë³¼ì ì´ë¬í ê²ì ê°ë¥íê² í´ì¤ëë¤:
class MyArray extends Array {
// ë¶ëª¨ Array ìì±ìë¡ species ë®ì´ì°ê¸°
static get [Symbol.species]() {
return Array;
}
}
var a = new MyArray(1, 2, 3);
var mapped = a.map((x) => x * x);
console.log(mapped instanceof MyArray); // false
console.log(mapped instanceof Array); // true
super
를 íµí ìì í´ëì¤ í¸ì¶
super
í¤ìëë ê°ì²´ì ë¶ëª¨ê° ê°ì§ê³ ìë ë©ìë를 í¸ì¶í기 ìí´ ì¬ì©ë©ëë¤. ì´ë íë¡í íì
ê¸°ë° ììë³´ë¤ ì¢ì ì ì¤ íëì
ëë¤.
class Cat {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise.`);
}
}
class Lion extends Cat {
speak() {
super.speak();
console.log(`${this.name} roars.`);
}
}
let l = new Lion("Fuzzy");
l.speak();
// Fuzzy makes a noise.
// Fuzzy roars.
Mix-ins
ì¶ì ìë¸ í´ëì¤ ëë 믹ì¤-ì¸ì í´ëì¤ë¥¼ ìí í í릿ì ëë¤. ECMAScript í´ëì¤ë íëì ë¨ì¼ ìí¼í´ëì¤ë§ì ê°ì§ ì ìì¼ë©°, ì를 ë¤ì´ í´ë§ í´ëì¤ë¡ë¶í°ì ë¤ì¤ ììì ë¶ê°ë¥í©ëë¤. 기ë¥ì ë°ëì ìí¼í´ëì¤ìì ì ê³µëì´ì¼ í©ëë¤.
ìí¼í´ëì¤ë¥¼ ì¸ìë¡ ë°ê³ ì´ ìí¼í´ëì¤ë¥¼ íì¥íë ìë¸í´ëì¤ë¥¼ ìì±íì¬ ë°ííë í¨ì를 ì¬ì©íì¬ ECMAScriptìì 믹ì¤-ì¸ì 구íí ì ììµëë¤:
var calculatorMixin = (Base) =>
class extends Base {
calc() {}
};
var randomizerMixin = (Base) =>
class extends Base {
randomize() {}
};
ì 믹ì¤-ì¸ì ì¬ì©íë í´ëì¤ë ë¤ìê³¼ ê°ì´ ìì±í ì ììµëë¤:
class Foo {}
class Bar extends calculatorMixin(randomizerMixin(Foo)) {}
í´ëì¤ ì¬ì ì
í´ëì¤ë ì¬ì ìë ì ììµëë¤. ì¬ì ì를 ìëíë©´ SyntaxError
ê° ë°ìí©ëë¤.
ì´ë¥¼ ì¤íí´ë³´ê³ ì¶ì¼ë©´ FireFox Web Console (Tools > Web Developer > Web Console) ìì ê°ì ì´ë¦ì¼ë¡ í´ëì¤ë¥¼ ëë² ì ìíë ¤ê³ í´ë³´ì¸ì. ë¤ìê³¼ ê°ì ì¤ë¥ë¥¼ ë³´ê² ë ê²ëë¤. SyntaxError: redeclaration of let ClassName;
. (See further discussion of this issue in Firefox bug 1428672.) Doing something similar in Chrome Developer Tools gives you a message like Uncaught SyntaxError: Identifier 'ClassName' has already been declared at <anonymous>:1:1
.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4