ãªãã¸ã§ã¯ãã¯é常ãã¦ã¼ã¶ã注æãªã©ã®ããã«ãå®ä¸çã«åå¨ãããã®ã表ç¾ããããã«ä½ããã¾ã:
let user = {
name: "John",
age: 30
};
ããã¦ãå®ä¸çã§ã¯ãã¦ã¼ã¶ã¯ã·ã§ããã³ã°ã«ã¼ãããä½ããé¸ãã ãããã°ã¤ã³ãããããã°ã¢ã¦ããããã¨ã ã¢ã¯ã·ã§ã³ ãããã¨ãã§ãã¾ãã
ã¢ã¯ã·ã§ã³ã¯ãJavaScriptã§ã¯ããããã£ã®é¢æ°ã¨ãã¦è¡¨ç¾ããã¾ãã
ã¡ã½ããä¾
ã¾ãåãã«ãuser ã Hello ã¨è¨ãããã«ãã¦ã¿ã¾ããã:
let user = {
name: "John",
age: 30
};
user.sayHi = function() {
alert("Hello!");
};
user.sayHi(); // Hello!
ããã§ã¯é¢æ°å¼ã使ã£ã¦é¢æ°ã使ããããããªãã¸ã§ã¯ãã®ãããã㣠user.sayHi ã«å²ãå½ã¦ã¦ãã¾ãã
ãã®é¢æ°ã¯ user.sayHi() ã¨ããå½¢å¼ã§å¼ã³åºããã¨ãã§ãã¾ããããã§ã¦ã¼ã¶ã話ããããã«ãªãã¾ãã!
ãªãã¸ã§ã¯ãã®ããããã£ã¨ãªã£ã¦ãã颿°ã¯ãã¡ã½ãã ã¨å¼ã°ãã¾ãã
ã¤ã¾ããããã§ã¯ user ãªãã¸ã§ã¯ãã® sayHi ã¡ã½ãããã§ããã¨ãããã¨ã§ãã
ãã¡ãããæ¬¡ã®ããã«ãå®£è¨æ¸ã¿ã®é¢æ°ãã¡ã½ããã¨ãã¦ä½¿ããã¨ãã§ãã¾ã:
let user = {
// ...
};
// æåã«é¢æ°ãè¨è¿°
function sayHi() {
alert("Hello!");
};
// ãã®å¾ãã¡ã½ããã¨ãã¦è¿½å
user.sayHi = sayHi;
user.sayHi(); // Hello!
ã¨ã³ãã£ãã£ã表ç¾ããããã«ãªãã¸ã§ã¯ãã使ã£ã¦ã³ã¼ããæ¸ããã¨ããããã¯ããªãã¸ã§ã¯ãæåããã°ã©ãã³ã°(object-oriented programming), ç¥ã㦠âOOPâ ã¨å¼ã°ãã¾ãã
OOPã¯å¤§ããªãã®ã§ãããããèªä½ãè峿·±ãç§å¦ã§ãã ã©ããã£ã¦é©åãªã¨ã³ãã£ãã£ã鏿ãããããã®éã®ç¸äºä½ç¨ãæ´çããã®ãï¼ ãããã¢ã¼ããã¯ãã£ã§ããããã®ãããã¯ã«ã¤ãã¦ã¯ç´ æ´ãããæ¬ãããã¾ãã E.Gamma, R.Helm, R.Johnson, J.Vissides ã«ãã âDesign Patterns: Elements of Reusable Object-Oriented Softwareâ ãã G.Booch ã«ãã âObject-Oriented Analysis and Design with Applicationsâ ãªã©ã§ãã
ã¡ã½ããã®ç縮表ç¾
ãªãã¸ã§ã¯ããªãã©ã«ã§ã¯ãã¡ã½ããã®ããã®çç¸®æ§æãããã¾ã:
// ãããã®ãªãã¸ã§ã¯ãã¯åããã¨ããã¾ã
let user = {
sayHi: function() {
alert("Hello");
}
};
// ã¡ã½ããç°¡ç¥åã¯ã¹ãããªè¦ãã¾ãã
let user = {
sayHi() { // "sayHi: function()" ã¨åãã§ã
alert("Hello");
}
};
ä¸ã®éãã"function" ãçããåã« sayHi() ã¨æ¸ããã¨ãã§ãã¾ãã
å®ãè¨ãã¨ã両è ã®è¡¨è¨ã¯å®å ¨ã«åä¸ã§ã¯ããã¾ããããªãã¸ã§ã¯ãã®ç¶æ¿(å¾ã§èª¬æãã¾ã)ã«é¢ãã¦å¾®å¦ãªéããããã¾ãããä»ã®ã¨ããã¯åé¡ããã¾ãããã»ã¨ãã©ã®å ´åãçãæ§æã®æ¹ã好ã¾ãã¾ãã
ã¡ã½ããä¸ã® âthisâ
ãªãã¸ã§ã¯ãã®ã¡ã½ãããå¦çãããããã«ããªãã¸ã§ã¯ãã«æ ¼ç´ããã¦ããæ å ±ã«ã¢ã¯ã»ã¹ããå¿ è¦ããããã¨ã¯ä¸è¬çã§ãã
ä¾ãã°ãuser.sayHi() å
ã®ã³ã¼ãã user ã®ååãå¿
è¦ã¨ããããããã¾ããã
ãªãã¸ã§ã¯ãã«ã¢ã¯ã»ã¹ããããã«ãã¡ã½ãã㯠this ãã¼ã¯ã¼ãã使ããã¨ãã§ãã¾ãã
this ã®å¤ã¯ã¡ã½ãããå¼ã³åºãã®ã«ä½¿ããã âãããã®åâ ã®ãªãã¸ã§ã¯ãã§ãã
ä¾:
let user = {
name: "John",
age: 30,
sayHi() {
// "this" 㯠"ç¾å¨ã®ãªãã¸ã§ã¯ã"
alert(this.name);
}
};
user.sayHi(); // John
ããã§ user.sayHi() ã®å®è¡ä¸ãthis ã®å¤ã¯ user ã«ãªãã¾ãã
æè¡çã«ã¯ãå¤é¨å¤æ°ãä»ãã¦åç
§ãããã¨ã§ãthis ã使ããã«ãªãã¸ã§ã¯ãã«ã¢ã¯ã»ã¹ãããã¨ãå¯è½ã§ã:
let user = {
name: "John",
age: 30,
sayHi() {
alert(user.name); // "this" ã®ä»£ããã« "user"
}
};
â¦ãããããã®ãããªã³ã¼ãã¯ä¿¡é ¼æ§ã«æ¬ ãã¾ãããã user ã admin = user ã®ããã«å¥ã®å¤æ°ã«ã³ãã¼ãããã¨ã«ããä½ãã§userã䏿¸ãããã¨ãééã£ããªãã¸ã§ã¯ãã«ã¢ã¯ã»ã¹ãããã¨ã«ãªãã¾ãã
次ã®ãããªæãã§ã:
let user = {
name: "John",
age: 30,
sayHi() {
alert( user.name ); // ã¨ã©ã¼ã«ã¤ãªãã
}
};
let admin = user;
user = null; // æããã«ããããã«ä¸æ¸ããã¾ã
admin.sayHi(); // Whoops! sayHi() ã®ä¸ã§å¤ãååã使ããã¾ãã! ã¨ã©ã¼ã§ã!
alert ã®å¼ã³åºãã§ãuser.name ã§ã¯ãªã this.name ã使ãã®ã§ããã°ãã³ã¼ãã¯åä½ããã§ãããã
âthisâ ã¯ãã¤ã³ãããã¦ãã¾ãã
JavaScriptã§ã¯ã âthisâ ãã¼ã¯ã¼ãã¯ä»ã®ã»ã¨ãã©ã®ããã°ã©ãã³ã°è¨èªã¨ã¯ç°ãªãæ¯ãèãããã¾ãããªãã¸ã§ã¯ãã®ã¡ã½ããã ãã§ã¯ãªããä»»æã®é¢æ°å ã§ä½¿ç¨ãããã¨ãã§ãã¾ãã
ãã®ãããªã³ã¼ããæ§æã¨ã©ã¼ã«ã¯ãªãã¾ãã:
function sayHi() {
alert( this.name );
}
this ã®å¤ã¯ãå®è¡æã«ã³ã³ããã¹ãã«å¿ãã¦è©ä¾¡ããã¾ãã
ä¾ãã°ãããã§ã¯åã颿°ã2ã¤ã®ç°ãªããªãã¸ã§ã¯ãã«å²ãå½ã¦ããã¦ãããå¼ã³åºãã®éã«ç°ãªã "this "ã使ããã¦ãã¾ã:
let user = { name: "John" };
let admin = { name: "Admin" };
function sayHi() {
alert( this.name );
}
// 2ã¤ã®ãªãã¸ã§ã¯ãã§åã颿°ã使ã
user.f = sayHi;
admin.f = sayHi;
// ãããã®å¼ã³åºãã¯ç°ãªã this ãæã¡ã¾ã
// 颿°ã®ä¸ã® "this" 㯠"ããã" ã®åã®ãªãã¸ã§ã¯ãã§ã
user.f(); // John (this == user)
admin.f(); // Admin (this == admin)
admin['f'](); // Admin (ãããã§ãè§æ¬å¼§ã§ãåé¡ãªãã¡ã½ããã«ã¢ã¯ã»ã¹ã§ãã¾ã)
ã«ã¼ã«ã¯ã·ã³ãã«ã§ããobj.f() ãå¼ã³åºãããã¨ãf ã®å¼ã³åºãä¸ã¯ this 㯠obj ã§ããã¤ã¾ããä¸ã®ä¾ã§ã¯ user ã¾ã㯠admin ã¨ãªãã¾ãã
this == undefinedãªãã¸ã§ã¯ãããªãã¦ã颿°ãå¼ã³åºããã¨ãã§ãã¾ã:
function sayHi() {
alert(this);
}
sayHi(); // undefined
ãã®ã±ã¼ã¹ã§ã¯ã strict ã¢ã¼ãã§ã¯ this 㯠undefined ã«ãªãã¾ãããã this.name ã«ã¢ã¯ã»ã¹ãããã¨ããã¨ã¨ã©ã¼ã«ãªãã¾ãã
é strict ã¢ã¼ã(誰ãã use strict ãå¿ããå ´å)ã§ã¯ããã®ãããªã±ã¼ã¹ã§ã¯ this ã®å¤ã¯ ã°ãã¼ãã«ãªãã¸ã§ã¯ã (ãã©ã¦ã¶ã§ã¯ windowãå¾ã»ã©å¦ã³ã¾ã)ã«ãªãã¾ãããã㯠"use strict" ã§ä¿®æ£ãããæ´å²çãªæ¯ãèãã§ãã
ãªãã¸ã§ã¯ããªãã§ this ã使ã颿°ã®å¼ã³åºãã¯ãä¸è¬çã«ããã°ã©ãã³ã°ã¨ã©ã¼ã§ãããã¨ã«æ³¨æãã¦ãã ããã颿°ã®ä¸ã« this ãããå ´åãããã¯ãªãã¸ã§ã¯ãã®ã³ã³ããã¹ãã§å¼ã°ãããã¨ãæå¾
ãã¦ãã¾ãã
this ã®çµæããããªããä»ã®ããã°ã©ãã³ã°è¨èªããæ¥ãã®ã§ããã°ãæãã âãã¤ã³ãããã thisâ ã®èãæ¹ã«æ
£ãã¦ããã§ããããããã¯ããªãã¸ã§ã¯ãã«å®ç¾©ãããã¡ã½ããã¯å¸¸ã«ãã®ãªãã¸ã§ã¯ããåç
§ãã this ãæã£ã¦ãããã¨è¨ããã®ã§ãã
JavaScriptã§ã¯ã this 㯠âèªç±â ã§ãããã®å¤ã¯å®è¡æã«è©ä¾¡ãããã¡ã½ããã宣è¨ããã¦ããå ´æã«ã¯ä¾åããã âãããã®åã®â ãªãã¸ã§ã¯ããä½ã§ããããã«ä¾åãã¾ãã
å®è¡æã«è©ä¾¡ããã this ã®æ¦å¿µã¯ããã©ã¹ã¨ãã¤ãã¹ã®ä¸¡æ¹ãæã£ã¦ãã¾ãã䏿¹ã§ã¯ã1ã¤ã®é¢æ°ãç°ãªããªãã¸ã§ã¯ãã§åå©ç¨ãããã¨ãã§ãã¾ãã仿¹ã§ã¯ããã大ããªæè»æ§ã¯ããã¹ã®æããããã«ã¤ãªããã¾ãã
ããã§ãæã ã®ãã¸ã·ã§ã³ã¯ããã®è¨èªè¨è¨ä¸ã®æ±ºå®ãè¯ããæªããã夿ãããã®ã§ã¯ããã¾ãããæã ã¯ããããã©ããã£ã¦ä½¿ãããã©ããã£ã¦å©çãå¾ã¦ãã©ã®ããã«åé¡ãåé¿ããããçè§£ããã®ã§ãã
ã¢ãã¼é¢æ°ã¯ âthisâ ãæã¡ã¾ãã
ã¢ãã¼é¢æ°ã¯ç¹å¥ã§ãããã㯠âèªèº«ã®â this ãæã¡ã¾ããããããã®ãããªé¢æ°ã§ this ãåç
§ããå ´åãå¤é¨ã® âé常ã®â 颿°ããåå¾ããã¾ãã
ä¾ãã°ãããã§ arrow() ã¯ãå¤é¨ã® user.sayHi() ã¡ã½ãããã this ã使ãã¾ã:
let user = {
firstName: "Ilya",
sayHi() {
let arrow = () => alert(this.firstName);
arrow();
}
};
user.sayHi(); // Ilya
ããã¯ã¢ãã¼é¢æ°ã®ç¹å¥ãªæ©è½ã§ããå¥ã® this ã§ã¯ãªããå¤å´ã®ã³ã³ããã¹ãããåãåºãããå ´åã«ä¾¿å©ã§ããã¢ãã¼é¢æ°ãµããã³ã®ã»ã¯ã·ã§ã³ã®å¾åã§ã¯ãããå¤ãã®ã¢ãã¼é¢æ°ãæ±ãã¾ãã
ãµããª
- ãªãã¸ã§ã¯ãã®ããããã£ã«æ ¼ç´ããã¦ãã颿°ã¯ âã¡ã½ããâ ã¨å¼ã°ãã¾ãã
- ã¡ã½ããã¯ã
object.doSomething()ã®ããã«ããªãã¸ã§ã¯ãã âè¡åâ ããããã¨ãã§ãã¾ãã - ã¡ã½ããã¯ãªãã¸ã§ã¯ãã
thisã§åç §ãããã¨ãã§ãã¾ãã
this ã®å¤ã¯å®è¡æã«å®ç¾©ããã¾ãã
- 颿°ã®å®£è¨æã颿°å
ã§
thisã使ããã¨ãã§ãã¾ããã ãã®thisã¯é¢æ°ãå¼ã³åºãããã¾ã§å¤ãæã£ã¦ãã¾ããã - 颿°ã¯ãªãã¸ã§ã¯ãéã§ã³ãã¼ãããã¨ãã§ãã¾ãã
- 颿°ã
object.method()ã¨ãã âã¡ã½ããâ æ§æã§å¼ã³åºãããå ´åãå¼ã³åºãä¸ã®thisã®å¤ã¯ãobjectã§ãã
ã¢ãã¼é¢æ°ã¯ç¹å¥ã§ãthis ãæããªããã¨ã«æ³¨æãã¦ãã ãããthis ãã¢ãã¼é¢æ°ã®ä¸ã§ã¢ã¯ã»ã¹ãããã¨ããããã¯å¤å´ããåå¾ããã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã