é常㮠{...} æ§æã§ã¯ã1ã¤ã®ãªãã¸ã§ã¯ãã使ã§ãã¾ããããããè¤æ°ã®ã¦ã¼ã¶ãã¡ãã¥ã¼ã¢ã¤ãã ãªã©ãä¼¼ããããªãªãã¸ã§ã¯ãã夿°ä½æããå¿
è¦ãããå ´åãããã¾ãã
ãã®ãããªãã¨ã¯ãã³ã³ã¹ãã©ã¯ã¿é¢æ°ã¨ "new" æ¼ç®åã使ããã¨ã§å®ç¾ã§ãã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ 颿°
ã³ã³ã¹ãã©ã¯ã¿é¢æ°ã¯æè¡çã«ã¯é常ã®é¢æ°ã§ããããã«ã¯2ã¤ã®æ £ç¿ãããã¾ã:
- ååã¯å¤§æåã§å§ãã¾ãã
"new"æ¼ç®åã使ã£ã¦ã®ã¿å®è¡ãããã¹ãã§ãã
ä¾:
function User(name) {
this.name = name;
this.isAdmin = false;
}
let user = new User("Jack");
alert(user.name); // Jack
alert(user.isAdmin); // false
new æ¼ç®åãç¨ãã¦é¢æ°ãå®è¡ãããå ´åãæ¬¡ã®ãããªå¦çãè¡ããã¾ã:
- æ°ãã空ã®ãªãã¸ã§ã¯ãã使ããã
thisã«å²ãå½ã¦ããã¾ãã - 颿°æ¬ä½ãå®è¡ãã¾ããéå¸¸ã¯æ°ããããããã£ã追å ãããã¨ã§
thisã«å¤æ´ãå ãã¾ãã thisã®å¤ãè¿ããã¾ãã
ã¤ã¾ããnew User(...) ã¯æ¬¡ã®ãããªãã¨ãè¡ãã¾ã:
function User(name) {
// this = {}; (æé»)
// this ã¸ããããã£ã追å
this.name = name;
this.isAdmin = false;
// return this; (æé»)
}
ãããã£ã¦ãlet user = new User("Jack") ã¯ã以ä¸ã¨åãçµæã¨ãªãã¾ã:
let user = {
name: "Jack",
isAdmin: false
};
ããä»ã®ã¦ã¼ã¶ãä½ãããã®ã§ããã°ãnew User("Ann")ãnew User("Alice") ã¨è¨ã£ãããã«å¼ã³åºããã¨ãã§ãã¾ããæ¯åãªãã©ã«ã使ãããã¯ããã«çããã¾ãèªã¿ããããªãã¾ãã
åå©ç¨å¯è½ãªãªãã¸ã§ã¯ã使ã®ã³ã¼ããå®è£ ãããã¨ããããã³ã³ã¹ãã©ã¯ã¿ã®ä¸»ãªç®çã§ãã
æ¹ãã¦çæãã¦ããã¾ããããæè¡çã«ã¯ã©ã®ãããªé¢æ°ï¼this ãæããªãã¢ãã¼é¢æ°ãé¤ãï¼ã§ãã³ã³ã¹ãã©ã¯ã¿ã¨ãã¦ä½¿ç¨ã§ãã¾ããã¤ã¾ããã©ã®é¢æ°ã new ã§å®è¡ãããã¨ãã§ããä¸è¨ã®ã¢ã«ã´ãªãºã ãå®è¡ããããã¨ã«ãªãã¾ããâå
é ã大æåâ ã¨ããã®ã¯ã颿°ã new ã§å®è¡ããããã¨ãæç¢ºã«ããããã®å
±éã®åæã§ãã
1ã¤ã®è¤éãªãªãã¸ã§ã¯ãã使ããããã®ã³ã¼ããããããããå ´åãæ¬¡ã®ããã«å³åº§ã«å¼ã³åºãããã³ã³ã¹ãã©ã¯ã¿é¢æ°ã§ã©ãããããã¨ãã§ãã¾ã:
let user = new function() {
this.name = "John";
this.isAdmin = false;
// ...ã¦ã¼ã¶ä½æã®ããã®ä»ã®ã³ã¼ãã
// è¤éãªãã¸ãã¯ãæ
// ãã¼ã«ã«å¤æ°ãªã©ãæã¤ããããã¾ããã
};
ãã®ã³ã³ã¹ãã©ã¯ã¿ã¯ã©ãã«ãä¿åããã¦ããããåã«ä½ã£ã¦å¼ã³åºãããã ããªã®ã§åã³å¼ã³åºããã¨ã¯ã§ãã¾ããããããã£ã¦ãã®ããªãã¯ã¯ãå°æ¥ã®åå©ç¨ã¯èãããåä¸ã®ãªãã¸ã§ã¯ããæ§æããã³ã¼ããã«ãã»ã«åãããã¨ãç®çã¨ãã¦ãã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ã®å¼ã³åºãã¢ã¼ãã®ç¢ºèª: new.target
ãã®ã»ã¯ã·ã§ã³ã§ç»å ´ããæ§æã¯ãã£ãã«ä½¿ãããªãããããã¹ã¦ã«ã¤ãã¦ç¥ãããã®ã§ãªããã°ã¹ããããã¦ãæ§ãã¾ããã
颿°ã®ä¸ã§ã¯ãnew.target ã¨ããç¹å¥ãªããããã£ã使ããã¨ã§ãnew ã使ã£ã¦å¼ã³åºãããã®ãããã§ãªãã®ãã確èªãããã¨ãã§ãã¾ãã
ãã®ããããã£ã¯ãé常ã®å¼ã³åºãã§ã¯ undefined ã§ããã new ã§å¼ã³åºãããå ´åã¯ãã®é¢æ°ã¨çãããªãã¾ã:
function User() {
alert(new.target);
}
// new ãªã:
User(); // undefined
// new ãã:
new User(); // function User { ... }
ããã颿°å
ã§ä½¿ç¨ãããã¨ã«ãããnew ãä»ãã¦ãã³ã³ã¹ãã©ã¯ã¿ã¢ã¼ããã§å¼ã³åºãããã®ããããã㯠new ãä»ããã«ãé常ã¢ã¼ããã§å¼ã³åºãããã®ããç¥ããã¨ãã§ãã¾ãã
new ã®å ´åã¨ãé常å¼ã³åºã両æ¹ã®æ§æãåãããã«åä½ããããã«ããããã«ä½¿ç¨ãããã¨ãã§ãã¾ã:
function User(name) {
if (!new.target) { // new ãªãã§å®è¡ããå ´å
return new User(name); // ...new ã追å ãã¾ã
}
this.name = name;
}
let john = User("John"); // new User ã¸ã®ãªãã¤ã¬ã¯ã
alert(john.name); // John
ãã®ã¢ããã¼ãã¯ãæ§æãããæè»ã«ããããã«ã©ã¤ãã©ãªä¸ã§ä½¿ããããã¨ãããã¾ããnew ã®æç¡ã«é¢ãããåãåä½ããããããªã颿°ã®å¼ã³åºããå¯è½ã¨ããããã§ãã
new ãçç¥ããã¨ä½ãèµ·ãã£ã¦ããã®ããå°ããããã«ãããªããããã©ãã¸ã§ãããã使ãã®ã¯è¯ããã¨ã§ã¯ãªãã§ããããnew ãããã°ãæ°ãããªãã¸ã§ã¯ããä½ããããã¨ãç¥ããã¨ãã§ãã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ããã®è¿å´
é常ãã³ã³ã¹ãã©ã¯ã¿ã¯ return æãæã¡ã¾ãããã³ã³ã¹ãã©ã¯ã¿ã®ä»äºã¯ãå¿
è¦ãªãã®ããã¹ã¦ this ã®ä¸ã«æ¸ãè¾¼ããã¨ã§ãããthis ãèªåçã«æ»ãå¤ã¨ãªãã¾ãã
ããããreturn æãããå ´åã®ã«ã¼ã«ã¯ã·ã³ãã«ã§ã:
- ãã
returnããªãã¸ã§ã¯ãã¨ä¸ç·ã«å¼ã°ããå ´åãthisã®ä»£ããã«ãªãã¸ã§ã¯ããè¿ããã¾ãã - ãã
returnãããªããã£ãã¨ä¸ç·ã«å¼ã°ããå ´åãããã¯ç¡è¦ããã¾ãã
è¨ãæããã¨ããªãã¨ã¸ã§ã¯ãã®return ã¯ãã®ãªãã¸ã§ã¯ããè¿ãããã以å¤ã®ã±ã¼ã¹ã§ã¯ this ãè¿ããã¾ãã
ä¾ãã°ãããã§ return ã¯ãªãã¸ã§ã¯ãã¨å
±ã«å¼ã°ãã¦ãããããthis ããåªå
ãã¦ãã®ãªãã¸ã§ã¯ããè¿ããã¾ã:
function BigUser() {
this.name = "John";
return { name: "Godzilla" }; // <-- ãªãã¸ã§ã¯ããè¿ã
}
alert( new BigUser().name ); // Godzilla, ãªãã¸ã§ã¯ããåå¾ ^^
ããã¦ãããã¯ç©ºã® return ã®ä¾ã§ã(return ã®å¾ã«ããªããã£ããç½®ããå ´åãåãã§ã)
function SmallUser() {
this.name = "John";
return; // <-- returns this
}
alert( new SmallUser().name ); // John
é常ãã³ã³ã¹ãã©ã¯ã¿ã¯ return æãæã¡ã¾ãããããã§ããªãã¸ã§ã¯ããè¿ãã¨ãã®ç¹å¥ãªåä½ã«ã¤ãã¦è¨åãã¦ããã®ã¯ã主ã«ç¶²ç¾
æ§ã®ããã§ãã
ã¨ããã§ããã弿°ãæããªãå ´åã¯ãnew ã®å¾ã®ä¸¸æ¬å¼§ãçç¥ãããã¨ãã§ãã¾ãã
let user = new User; // <-- æ¬å¼§ãªã
// ããã¨åã
let user = new User();
丸æ¬å¼§ã®çç¥ã¯ âè¯ãã¹ã¿ã¤ã«â ã§ã¯ããã¾ãããããã®æ§æã¯ä»æ§ã§èªãããã¦ãã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ã®ä¸ã®ã¡ã½ãã
ãªãã¸ã§ã¯ããä½ãã¨ããã³ã³ã¹ãã©ã¯ã¿é¢æ°ã使ç¨ãããã¨ã§é«ãæè»æ§ãå¾ããã¨ãã§ãã¾ããã³ã³ã¹ãã©ã¯ã¿é¢æ°ã¯ãªãã¸ã§ã¯ããã©ã®ããã«çµã¿ç«ã¦ããããããã®ä¸ã«ä½ãç½®ãããå®ç¾©ãããã©ã¡ã¼ã¿ãæã£ã¦ãã¾ãã
ãã¡ãããthis ã«ã¯ããããã£ã ãã§ã¯ãªããåæ§ã«ã¡ã½ããã追å ãããã¨ãã§ãã¾ãã
ä¾ãã°ãä¸ã® new User(name) ã¯ãname 㨠sayHi ã¡ã½ãããæã¤ãªãã¸ã§ã¯ããä½ãã¾ã:
function User(name) {
this.name = name;
this.sayHi = function() {
alert( "My name is: " + this.name );
};
}
let john = new User("John");
john.sayHi(); // My name is: John
/*
john = {
name: "John",
sayHi: function() { ... }
}
*/
è¤éãªãªãã¸ã§ã¯ããä½ãããã«ãããé«åº¦ãªæ§æ classes ãããã¾ããããã«é¢ãã¦ã¯å¾ã»ã©èª¬æãã¾ãã
ãµããª
- ã³ã³ã¹ãã©ã¯ã¿é¢æ°ï¼ãããã¯ç°¡æ½ã«ã³ã³ã¹ãã©ã¯ã¿ï¼ã¯é常ã®é¢æ°ã§ããã大æåããå§ã¾ãååãæã¤ã¨è¨ãå ±éã®åæãããã¾ãã
- ã³ã³ã¹ãã©ã¯ã¿é¢æ°ã¯
newã使ã£ã¦ã®ã¿å¼ã³åºãããã¹ãã§ãããã®å¼ã³åºãã¯ãæåã«ç©ºã®thisã使ããå¿ è¦ãªå¦çãè¡ãããthisãæå¾ã«è¿ããã¨ãæå³ãã¾ãã
è¤æ°ã®ä¼¼ããããªãªãã¸ã§ã¯ããä½ãããã«ãã³ã³ã¹ãã©ã¯ã¿é¢æ°ã使ããã¨ãã§ãã¾ãã
JavaScript ã«ã¯ãæ¥ä»ã表ã Date ãéåã表ã Setãããã¦ãã®ãã¨ç§ãã¡ãå¦ã¶äºå®ã®ãã®ãªã©ãå¤ãã®çµã¿è¾¼ã¿ãªãã¸ã§ã¯ãã«å¯¾ããã³ã³ã¹ãã©ã¯ã¿é¢æ°ãç¨æããã¦ãã¾ãã
ãã®ãã£ãã¿ã¼ã§ã¯ããªãã¸ã§ã¯ãã¨ã³ã³ã¹ãã©ã¯ã¿ã«ã¤ãã¦ã®åºç¤ã®ã¿ã説æãã¦ãã¾ãããããã¯ã次ã®ç« ã§ãã¼ã¿åã¨é¢æ°ã«ã¤ãã¦ããæ·±ãå¦ã¶ããã«ä¸å¯æ¬ ã§ãã
ããããå¦ãã ãã¨ãªãã¸ã§ã¯ãã«æ»ãããããã¿ã¤ã, ç¶æ¿ 㨠ã¯ã©ã¹ ã®åç« ã§è©³ãã説æãã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã