ãªãã¸ã§ã¯ãæåããã°ã©ãã³ã°ã§ã¯ãã¯ã©ã¹ ã¯ãªãã¸ã§ã¯ãçæãç¶æ (ã¡ã³ã夿°)ã®åæå¤ã®æä¾ãæ¯ãèãã®å®è£ (ã¡ã³ã颿°ã¾ãã¯ã¡ã½ãã)ã®ããã®æ¡å¼µå¯è½ãªããã°ã©ã ã³ã¼ããã³ãã¬ã¼ãã§ãã
å®è·µã§ã¯ãã¦ã¼ã¶ãååãªã©ãåã種é¡ã®ãªãã¸ã§ã¯ãã大éã«ä½æãããã¨ããã°ãã°ããã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ã new æ¼ç®å ã®ç« ã§ãã§ã«ãåç¥ã®éããnew function ã¯ããå ´åã«å½¹ç«ã¡ã¾ãã
ã§ãããææ°ã® JavaScript ã§ã¯ãããé«åº¦ãª âclassâ æ§é ãããããªãã¸ã§ã¯ãæåããã°ã©ãã³ã°ã«å½¹ç«ã¤åªããæ°æ©è½ãå°å ¥ããã¦ãã¾ãã
âclassâ æ§æ
åºæ¬ã®æ§æã¯æ¬¡ã®éãã§ã:
class MyClass {
// ã¯ã©ã¹ã¡ã½ãã
constructor() { ... }
method1() { ... }
method2() { ... }
method3() { ... }
...
}
ãã®å¾ãnew MyClass() ã§ããªã¹ãããããã¹ã¦ã®ã¡ã½ããããã¤æ°ãããªãã¸ã§ã¯ãã使ãã¾ãã
constructor() ã¡ã½ãã㯠new ã«ããèªåã§å¼ã³åºãããããã§ãªãã¸ã§ã¯ããåæåã§ãã¾ãã
ä¾
class User {
constructor(name) {
this.name = name;
}
sayHi() {
alert(this.name);
}
}
// ä½¿ãæ¹:
let user = new User("John");
user.sayHi();
new User("John") ãå¼ã³åºãããã¨:
- æ°ãããªãã¸ã§ã¯ããä½ããã¾ãã
- æå®ããã弿°ã§
constructorãå®è¡ãããthis.nameã¸ä»£å ¥ãã¾ãã
â¦ä»¥éãuser.sayHi() ã®ããã«ããªãã¸ã§ã¯ãã¡ã½ãããå¼ã³åºãã¾ãã
åå¿è ã®éçºè ã®è½ã¨ãç©´ã¨ãã¦ãã¯ã©ã¹ã¡ã½ããã®éã«ã«ã³ããç½®ããã¨ãããã¾ããããã¯æ§æã¨ã©ã¼ã«ãªãã¾ãã
ããã§ã®è¡¨è¨ã¯ãªãã¸ã§ã¯ããªãã©ã«ã¨æ··åããªãã§ãã ãããã¯ã©ã¹å ã§ã¯ãã«ã³ãã¯å¿ è¦ããã¾ããã
ã¯ã©ã¹ã¨ã¯ï¼
ã§ã¯ãclass ã¯æ£ç¢ºã«ä½ã§ããããï¼ããã¯ã¾ã£ããæ°ããè¨èªã¬ãã«ã®ã¨ã³ãã£ãã£ã§ã¯ããã¾ããã
éæ³ãè§£ãæããã¦ãã¯ã©ã¹ãå®éã«ä½ã§ãããè¦ã¦ã¿ã¾ããããããã¯å¤ãã®è¤éãªå´é¢ãçè§£ããã®ã«å½¹ç«ã¡ã¾ãã
JavaScript ã§ã¯ã¯ã©ã¹ã¯é¢æ°ã®ä¸ç¨®ã§ãã
ãããè¦ã¦ãã ãã:
class User {
constructor(name) { this.name = name; }
sayHi() { alert(this.name); }
}
// 証æ : User 㯠function ã§ã
alert(typeof User); // function
class User {...} æ§é ã¯å®éã«è¡ã£ã¦ãããã¨ã¯ä»¥ä¸ã§ã:
- ã¯ã©ã¹å®£è¨ã®çµæã¨ãªã
Userã¨è¨ãååã®é¢æ°ã使ãã¾ãã颿°ã³ã¼ãã¯constructorã¡ã½ããã§ãï¼ã¡ã½ããããªãå ´åã¯ç©ºã¨æ³å®ãã¾ãï¼ã User.prototypeã«ãsayHiãªã©ã®ã¯ã©ã¹ã¡ã½ãããæ ¼ç´ãã¾ãã
new User ãªãã¸ã§ã¯ãã使ãããå¾ããã®ã¡ã½ãããå¼ã³åºãã¨ãF.prototype ã®ç« ã§èª¬æãããã«ããããã¿ã¤ãããåå¾ããã¾ããå¾ã£ã¦ããªãã¸ã§ã¯ãã¯ã¯ã©ã¹ã¡ã½ããã¸ã®ã¢ã¯ã»ã¹ãæã¡ã¾ãã
class User 宣è¨ã®çµæã次ã®ããã«èª¬æã§ãã¾ã:
ããã確èªããã³ã¼ãã¯ä»¥ä¸ã§ã:
class User {
constructor(name) { this.name = name; }
sayHi() { alert(this.name); }
}
// class 㯠function
alert(typeof User); // function
// ...ãããã¯, ããæ£ç¢ºã«ã¯ User 㯠constructor ã¡ã½ãã
alert(User === User.prototype.constructor); // true
// ã¡ã½ãã㯠User.prototype ã«ããã¾ã e.g:
alert(User.prototype.sayHi); // sayHi ã¡ã½ããã®ã³ã¼ã
// prototype ã«ã¯æ£ç¢ºã«ã¯2ã¤ã®ã¡ã½ãããããã¾ã
alert(Object.getOwnPropertyNames(User.prototype)); // constructor, sayHi
åãªãã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ã¼ã§ã¯ããã¾ãã
class 㯠âã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ã¼âï¼æ°ãããã®ã¯å°å
¥ããã¦ããªãããããå¯èªæ§ãé«ãæ¸ãæ¹ï¼ã¨ãã人ãæã
ãã¾ããå®éãclass ãã¼ã¯ã¼ãã使ããã«åããã®ã宣è¨ãããã¨ãå¯è½ã§ãã:
// ç´ç²ãªé¢æ°ã§ User ã¯ã©ã¹ãæ¸ãæã
// 1. constructor 颿°ã使
function User(name) {
this.name = name;
}
// 颿° prototype 㯠"constructor" ããããã£ãããã©ã«ãã§æã¡ã¾ã
// ãªã®ã§ã使ã¯ä¸è¦ã§ã
// 2. prototype ã¸ã¡ã½ããã追å
User.prototype.sayHi = function() {
alert(this.name);
};
// ä½¿ãæ¹:
let user = new User("John");
user.sayHi();
ãã®å®ç¾©ã®çµæã¯ã»ã¼åãã§ãããªã®ã§ãã³ã³ã¹ãã©ã¯ã¿ã¨ãã®ãããã¿ã¤ãã¡ã½ãããä¸ç·ã«å®ç¾©ããããã®ãclass ã®ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ã¼ã¨ã¿ãªãããçç±ã¯ãããã«ããã¾ãã
ã§ãããéè¦ãªéããããã¾ãã
-
ã¾ãã
classã§çæããã颿°ã¯ç¹å¥ãªå é¨ããããã£[[IsClassConstructor]]: trueã§ã©ãã«ä»ãããã¦ãã¾ãããã®ãããæåã§ä½æããã®ã¨ã¾ã£ããåãã§ã¯ããã¾ãããè¨èªã¯æ§ã ãªç®æã§ãã®ããããã£ããã§ãã¯ãã¾ããä¾ãã°é常ã®é¢æ°ã¨ã¯ç°ãªãã
newã§å¼ã³åºãå¿ è¦ãããã¾ã:class User { constructor() {} } alert(typeof User); // function User(); // Error: ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ User 㯠`new` ãªãã§å¼ã³åºãã¾ããã¾ããã»ã¨ãã©ã® JavaScript ã¨ã³ã¸ã³ã§ã¯ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã®æåå表ç¾ã¯ãâclassâ¦â ã§å§ã¾ãã¾ã
class User { constructor() {} } alert(User); // class User { ... }ä»ã®éããããã¾ãããã®å¾è¦ã¦ããã¾ãã
-
ã¯ã©ã¹ ã¡ã½ããã¯åæä¸å¯ã§ã
ã¯ã©ã¹å®ç¾©ã¯ã
"prototype"ã«ãããã¹ã¦ã®ã¡ã½ããã«å¯¾ãã¦enumerableãã©ã°ãfalseã«ã»ãããã¾ãããªãã¸ã§ã¯ãã
for...inããã¨ããé常ã¯ã¯ã©ã¹ã¡ã½ããã¯å¿ è¦ãªãã®ã§ããã¯ä¾¿å©ã§ãã -
ã¯ã©ã¹ã¯å¸¸ã«
use strictã§ãã¯ã©ã¹æ§é ã®ä¸ã®ã³ã¼ãã¯ãã¹ã¦èªåã§ strict ã¢ã¼ãã§ãã
å ãã¦ãclass æ§æã«ã¯å¾ã§èª¬æãããããªå¤ãã®æ©è½ãããã¾ãã
ã¯ã©ã¹è¡¨ç¾
颿°ã¨åãããã«ãã¯ã©ã¹ãå¥ã®å¼ã®ä¸ã§å®ç¾©ããæ¸¡ããããè¿å´ãããä»£å ¥ãããã¨ãã§ãã¾ãã
ããã¯ã¯ã©ã¹å¼ã®ä¾ã§ãã:
let User = class {
sayHi() {
alert("Hello");
}
};
ååä»ã颿°ã¨åæ§ãã¯ã©ã¹ãååãæã¤ãã¨ãã§ãã¾ãã
ã¯ã©ã¹å¼ã«ååãããå ´åããã®ã¯ã©ã¹å é¨ã§ã®ã¿è¦ãã¾ã:
// "ååä»ãã¯ã©ã¹å¼"
// (ã¹ããã¯ã«ã¯ãã®ãããªç¨èªã¯ããã¾ããããååä»ã颿°å¼ã¨åãã§ã)
let User = class MyClass {
sayHi() {
alert(MyClass); // MyClass ã®ååã¯ã¯ã©ã¹ã®å
é¨ã§ã®ã¿è¦ãã¾ã
}
};
new User().sayHi(); // åä½ãã¾ã, MyClass ã®å®ç¾©ã表示
alert(MyClass); // error, MyClass ã®ååã¯ã¯ã©ã¹ã®å¤ããã¯è¦ãã¾ãã
次ã®ããã«ãã¯ã©ã¹ãåçã« âè¦æ±ã«å¿ãã¦â ä½ããã¨ãã§ãã¾ãã:
function makeClass(phrase) {
// ã¯ã©ã¹å®ç¾©ã¨ãã®è¿å´
return class {
sayHi() {
alert(phrase);
}
};
}
// æ°ããã¯ã©ã¹ã使
let User = makeClass("Hello");
new User().sayHi(); // Hello
Getters/setters
ãªãã©ã«ãªãã¸ã§ã¯ãã®ããã«ãã¯ã©ã¹ã getters/setters, ç®åºããããã£ãªã©ãå«ãããã¨ãã§ãã¾ãã
ããã¯ãget/set ã使ç¨ãã¦å®è£
ããã user.name ã®ä¾ã§ã:
class User {
constructor(name) {
// setter ãå¼ã³åºã
this.name = name;
}
get name() {
return this._name;
}
set name(value) {
if (value.length < 4) {
alert("Name too short.");
return;
}
this._name = value;
}
}
let user = new User("John");
alert(user.name); // John
user = new User(""); // Name too short.
æè¡çã«ã¯ããã®ãããªã¯ã©ã¹å®£è¨ã¯ User.prototype ã« getter / setter ã使ãããã¨ã§æ©è½ãã¾ãã
è¨ç®ãããååï¼computed nameï¼
ããã¯æ¬å¼§ [...] ã使ç¨ããè¨ç®ãããã¡ã½ããåã®ä¾ã§ãã
class User {
['say' + 'Hi']() {
alert("Hello");
}
}
new User().sayHi();
ãã®ãããªç¹å¾´ã¯ããªãã©ã«ãªãã¸ã§ã¯ãã«ä¼¼ã¦ããã®ã§ãè¦ããããã¨æãã¾ãã
ã¯ã©ã¹ãã£ã¼ã«ã
ã¯ã©ã¹ãã£ã¼ã«ãã¯æè¿è¨èªã«è¿½å ããããã®ã§ãã
以åã¯ãã¯ã©ã¹ã¯ã¡ã½ããã ããæã£ã¦ãã¾ããã
âã¯ã©ã¹ãã£ã¼ã«ãâ ã¯ä»»æã®ããããã£ã追å ã§ããæ§æã§ãã
ä¾ãã°ãclass User ã« name ããããã£ã追å ãã¾ãããã
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); // John
alert(User.prototype.name); // undefined
ã¾ããããè¤éãªå¼ã颿°å¼ã³åºãã§å¤ãä»£å ¥ãããã¨ãã§ãã¾ãã:
class User {
name = prompt("Name, please?", "John");
}
let user = new User();
alert(user.name); // John
ã¯ã©ã¹ãã£ã¼ã«ãã§ãã¤ã³ããããã¡ã½ããã使ãã
ç« é¢æ°ãã¤ã³ãã£ã³ã° ã§ãã¢ããããã«ãJavaScript ã§ã®é¢æ°ã¯åç㪠this ãæã¡ã¾ããããã¯å¼ã³åºãã®ã³ã³ããã¹ãã«ä¾åãã¾ãã
ãã®ããããªãã¸ã§ã¯ãã¡ã½ãããæ¸¡ãããå¥ã®ã³ã³ããã¹ãã§å¼ã³åºãããå ´åãthis ã¯ãããã®ãªãã¸ã§ã¯ãã®åç
§ã§ã¯ããã¾ããã
ä¾ãã°ããã®ã³ã¼ã㯠undefined ã«ãªãã¾ã:
class Button {
constructor(value) {
this.value = value;
}
click() {
alert(this.value);
}
}
let button = new Button("hello");
setTimeout(button.click, 1000); // undefined
åé¡ã¯ âthis ãªãâ ã§å¼ã³åºããããã¨ã§ãã
ç« é¢æ°ãã¤ã³ãã£ã³ã° ã§è°è«ããããã«ããããç´ã2ã¤ã®ã¢ããã¼ããããã¾ãã:
setTimeout(() => button.click(), 1000)ã®ããã«ã©ããã¼é¢æ°ã渡ãã- ã¡ã½ããããªãã¸ã§ã¯ãã«ãã¤ã³ãããã e.g. ã³ã³ã¹ãã©ã¯ã¿ã«ã¦ã
ã¯ã©ã¹ãã£ã¼ã«ãã¯å¥ã®ããã°ãããæ§æãæä¾ãã¾ã:
class Button {
constructor(value) {
this.value = value;
}
click = () => {
alert(this.value);
}
}
let button = new Button("hello");
setTimeout(button.click, 1000); // hello
ã¯ã©ã¹ãã£ã¼ã«ã click = () => {...} ã¯ãªãã¸ã§ã¯ããã¨ã«ä½ãããButton ãªãã¸ã§ã¯ããã¨ã«å¥ã
ã®é¢æ°ã§ããããã¦ãthis ã¯ãã®ãªãã¸ã§ã¯ããåç
§ãã¾ããã©ãã§ button.click ãæ¸¡ãã¦ããthis ã¯å¸¸ã«æ£ããå¤ã«ãªãã¾ãã
ããã¯ã¤ãã³ããªã¹ãã¼ãªã©ããã©ã¦ã¶ç°å¢ã§ç¹ã«å½¹ç«ã¡ã¾ãã
ãµããª
åºæ¬ã®ã¯ã©ã¹æ§æã¯æ¬¡ã®ããã«ãªãã¾ãã:
class MyClass {
prop = value; // ããããã£
constructor(...) { // ã³ã³ã¹ãã©ã¯ã¿
// ...
}
method(...) {} // ã¡ã½ãã
get something(...) {} // getter
set something(...) {} // setter
[Symbol.iterator]() {} // è¨ç®ãããååã®ã¡ã½ãã (ããã§ã¯ã·ã³ãã«)
// ...
}
MyClass ã¯æè¡çã«ã¯é¢æ°ï¼constructor ã¨ãã¦æä¾ï¼ã§ãã¡ã½ãããgetter / setter 㯠MyClass.prototype ã«è¨è¿°ããã¾ãã
次ã®ç« ã§ã¯ãç¶æ¿ãªã©ä»ã®æ©è½ãå«ããã¯ã©ã¹ã«ã¦ãã詳ããå¦ã³ã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã