"prototype" ããããã£ã¯JavaScriptèªèº«ã®ã³ã¢é¨åã§åºã使ããã¦ãã¾ãããã¹ã¦ã®çµã¿è¾¼ã¿ã®ã³ã³ã¹ãã©ã¯ã¿é¢æ°ã¯ããã使ç¨ãã¦ãã¾ãã
æåã«åç´ãªãªãã¸ã§ã¯ãã®å ´åãè¦ã¦ãããæ¬¡ã«ããè¤éãªãªãã¸ã§ã¯ãã®å ´åã«ã©ã®ããã«ãªãããè¦ã¦ããã¾ãããã
Object.prototype
空ã®ãªãã¸ã§ã¯ããåºåãã¦ã¿ã¾ãããã:
let obj = {};
alert( obj ); // "[object Object]" ?
æåå "[object Object]" ãçæããã³ã¼ãã¯ã©ãã«ããã®ã§ãããï¼ ããã¯çµã¿è¾¼ã¿ã® toString ã¡ã½ããã§ãããã©ãã«ããã®ã§ãããï¼ obj ã¯ç©ºã§ã!
â¦ããããçãè¨æ³ obj = {} 㯠obj = new Object() ã¨åãã§ããã® Object ã¯çµã¿è¾¼ã¿ã®ãªãã¸ã§ã¯ãã³ã³ã¹ãã©ã¯ã¿é¢æ°ã§ãããã®é¢æ°ã¯ toString ãä»ã®é¢æ°ãæã¤å·¨å¤§ãªãªãã¸ã§ã¯ããåç
§ãã Object.prototype ãæã£ã¦ãã¾ãã
ãã®ããã«ãªãã¾ã:
new Object() ãå¼ã°ãã(ãããã¯ãªãã©ã«ãªãã¸ã§ã¯ã {...} ãä½ããã)ã¨ãããã® [[Prototype]] ã¯åã®ãã£ãã¿ã¼ã§ç§ãã¡ã話ãã¦ããã«ã¼ã«ã«ãã£ã¦ã Object.prototype ã«ã»ããããã¾ãã:
ãã®å¾ãobj.toString() ãå¼ã°ããã¨ãObject.prototype ããã¡ã½ãããåãåºããã¾ãã
ãã®ããã«ãã¦ç¢ºèªã§ãã¾ã:
let obj = {};
alert(obj.__proto__ === Object.prototype); // true
alert(obj.toString === obj.__proto__.toString); //true
alert(obj.toString === Object.prototype.toString); //true
ä¸ã® Object.prototype ã®ãã§ã¼ã³ã§ã追å ã® [[Prototype]] ããªããã¨ã«æ³¨æãã¦ãã ããã:
alert(Object.prototype.__proto__); // null
ä»ã®çµã¿è¾¼ã¿ã®ãããã¿ã¤ã
Array, Date, Function ã®ãããªãä»ã®çµã¿è¾¼ã¿ã®ãªãã¸ã§ã¯ããã¾ããããã¿ã¤ãã«ã¡ã½ãããä¿æãã¦ãã¾ãã
ä¾ãã°ãé
å [1, 2, 3] ãä½ãã¨ããããã©ã«ãã® new Array() ã³ã³ã¹ãã©ã¯ã¿ãå
é¨ã§ä½¿ããã¾ãããªã®ã§ãé
åãã¼ã¿ã¯æ°ãããªãã¸ã§ã¯ãã«æ¸ãè¾¼ã¾ããArray.prototype ã¯ãã®ãããã¿ã¤ãã¨ãªããã¡ã½ãããæä¾ãã¾ããããã¯é常ã«ã¡ã¢ãªå¹çãè¯ãã§ãã
ã¹ããã¯ã§ã¯ããã¹ã¦ã®çµã¿è¾¼ã¿ã®ãããã¿ã¤ãã¯å
é ã« Object.prototype ãæã£ã¦ãã¾ãããªã®ã§ãâãã¹ã¦ã¯ãªãã¸ã§ã¯ããç¶æ¿ãã¦ããâ ã¨ãã人ããã¾ãã
å ¨ä½å³ã¯æ¬¡ã®ã¨ããã§ãï¼3ã¤ã®çµã¿è¾¼ã¿ã«ã¤ãã¦æ¸ãã¦ãã¾ãï¼:
ãããã¿ã¤ããæåã§ãã§ãã¯ãã¦ã¿ã¾ãããã:
let arr = [1, 2, 3];
// Array.prototype ããç¶æ¿ãã¦ãã?
alert( arr.__proto__ === Array.prototype ); // true
// 次㫠Object.prototype ããã¯ç¶æ¿ãã¦ãã?
alert( arr.__proto__.__proto__ === Object.prototype ); // true
// ããã¦ãããã® null
alert( arr.__proto__.__proto__.__proto__ ); // null
ãããã¿ã¤ãã®ã¡ã½ããã®ããã¤ãã¯éè¤ããå¯è½æ§ãããã¾ããä¾ãã°ãArray.prototype ã¯ã«ã³ãåºåãã§è¦ç´ ã表示ããèªèº«ã® toString ãæã£ã¦ãã¾ãã:
let arr = [1, 2, 3]
alert(arr); // 1,2,3 <-- Array.prototype.toString ã®çµæ
以åè¦ãããã«ãObject.prototype ãåæ§ã« toString ãæã£ã¦ãã¾ãããArray.prototype ã¯ãã§ã¼ã³ã§ããè¿ãä½ç½®ã«ããã®ã§ãé
åããã¤ãã®ã使ç¨ããã¾ãã
Chrome developer console ã®ãããªãã©ã¦ã¶å
ã®ãã¼ã«ã§ãç¶æ¿ã表示ã§ãã¾ã(çµã¿è¾¼ã¿ãªãã¸ã§ã¯ãã®ããã« console.dir ã使ãå¿
è¦ãããããããã¾ãã)ã
ä»ã®çµã¿è¾¼ã¿ãªãã¸ã§ã¯ããåãããã«åä½ãã¾ãã颿°ã§ãããããããã¯çµã¿è¾¼ã¿ã® Function ã³ã³ã¹ãã©ã¯ã¿ã®ãªãã¸ã§ã¯ãã§ãããã¡ã½ããã§ã: call/apply ãªã©ãFunction.prototype ããåãåºããããã®ã§ãã颿°ã«ã¯ç¬èªã® toStringãããã¾ãã
function f() {}
alert(f.__proto__ == Function.prototype); // true
alert(f.__proto__.__proto__ == Object.prototype); // true, object ããã®ç¶æ¿
ããªããã£ã(Primitives)
æãè¤éãªãã¨ã¯ãæååãæ°å¤ããã¼ã«å¤ã§èµ·ããã¾ãã
è¦ãã¦ããéãããããã¯ãªãã¸ã§ã¯ãã§ã¯ããã¾ããããããããããã®ããããã£ã¸ã¢ã¯ã»ã¹ããããã¨ããå ´åãçµã¿è¾¼ã¿ã®ã³ã³ã¹ãã©ã¯ã¿ String, Number, Boolean ã使ã£ã䏿çãªã©ããã¼ãªãã¸ã§ã¯ããä½ããã¾ãããããã¯ã¡ã½ãããæä¾ããæ¶ãã¾ãã
ãããã®ãªãã¸ã§ã¯ãã¯æã
ã«ã¯è¦ããªãå½¢ã§ä½ãããã»ã¨ãã©ã®ã¨ã³ã¸ã³ã¯ããããæé©åãã¾ãããã¹ããã¯ã§ã¯ãã®ããã«æ£ç¢ºã«èª¬æããã¦ãã¾ãããããã®ãªãã¸ã§ã¯ãã®ã¡ã½ãããã¾ã String.prototype, Number.prototype ã Boolean.prototype ã¨ãã¦å©ç¨å¯è½ãªãã®ã¨ãã¦ãããã¿ã¤ãã«åå¨ãã¾ãã
null 㨠undefined ã¯ãªãã¸ã§ã¯ãã©ããã¼ãæã£ã¦ãã¾ããç¹å¥ãªå¤ null ã undefined ã¯å¥ã§ãããããã¯ãªãã¸ã§ã¯ãã©ããã¼ãæã¡ã¾ããããã®ãããå©ç¨å¯è½ãªã¡ã½ãããããããã£ã¯ããã¾ãããã¾ãããããã«å¯¾å¿ãããããã¿ã¤ããããã¾ããã
ãã¤ãã£ããããã¿ã¤ãã®å¤æ´
ãã¤ãã£ããããã¿ã¤ãã¯å¤æ´ãããã¨ãã§ãã¾ããä¾ãã°ãããããã¡ã½ããã String.prototype ã«è¿½å ããå ´åãããã¯ãã¹ã¦ã®æååã§å©ç¨å¯è½ã«ãªãã¾ãã:
String.prototype.show = function() {
alert(this);
};
"BOOM!".show(); // BOOM!
éçºã®éç¨ã§ãæ°ããçµã¿è¾¼ã¿ã¡ã½ããã追å ãããã¨èãã¦ãããããã¾ãããããã¦ãããããã¤ãã£ããããã¿ã¤ãã«å ãããã¨ãããè¥å¹²ã®èªæãããããããã¾ãããã§ãããããã¯ä¸è¬çã«ã¯æªãèãã§ãã
ãããã¿ã¤ãã¯ã°ãã¼ãã«ãªã®ã§ãã³ã³ããªã¯ããçºçããããã§ããããï¼ã¤ã®ã©ã¤ãã©ãªãã¡ã½ãã `String.prototype.show` ã追å ãã¦ããå ´åãçæ¹ã¯ãã䏿¹ã«ä¸æ¸ãããã¾ãã
ãã®ãããä¸è¬çã«ã¯ããã¤ãã£ãã®ãããã¿ã¤ãã®å¤æ´ã¯æªãã¢ã¤ãã¢ã¨ããã¦ãã¾ãã
ç¾ä»£ã®ããã°ã©ãã³ã°ã§ã¯ããã¤ãã£ããããã¿ã¤ãã®å¤æ´ãèªããããã±ã¼ã¹ãï¼ã¤ã ãããã¾ããããã¯ããªãã£ã«ã§ãã
ããªãã£ã«ã¯ JavaScript ã®ã¹ããã¯ã«ã¯åå¨ããããç¹å®ã®JavaScript ã¨ã³ã¸ã³ã§ã¯ã¾ã ãµãã¼ãããã¦ããªãã¡ã½ããã®ä»£ãããç¨æãããã¨ãæãç¨èªã§ãã
æåã§å®è£ ããçµã¿è¾¼ã¿ã®ãããã¿ã¤ãã«ãããåãè¾¼ããã¨ãã§ãã¾ãã
ä¾:
if (!String.prototype.repeat) { // ãããã®ãããªã¡ã½ããããªãå ´å
// prototype ã«è¿½å ãã¾ã
String.prototype.repeat = function(n) {
// æååã n åç¹°ãè¿ã
// å®éããã®ã³ã¼ãã¯ããããè¤éã«ãªãã¾ã
// "n" ã®è² ã®å¤ã«å¯¾ããã¨ã©ã¼ã®ã¹ãã¼
// å®å
¨ãªã¢ã«ã´ãªãºã ã¯ä»æ§ã«ããã¾ã
return new Array(n + 1).join(this);
};
}
alert( "La".repeat(3) ); // LaLaLa
ãããã¿ã¤ãããã®åç¨
ãã£ãã¿ã¼ ãã³ã¬ã¼ã¿ã¨è»¢é, call/apply ã§ç§ãã¡ã¯ã¡ã½ããã®åç¨ã«ã¤ãã¦è©±ãã¾ããã:
ããã¯ãããªãã¸ã§ã¯ãããã¡ã½ãããã¨ãããããå¥ã®ãªãã¸ã§ã¯ãã«ã³ãã¼ããã¨ãã§ãã
ãã¤ãã£ããããã¿ã¤ãã®ã¡ã½ããã®ããã¤ãã¯ãã°ãã°åç¨ããã¾ãã
ä¾ãã°ãé
åã©ã¤ã¯ãªãªãã¸ã§ã¯ãã使ãã¦ããå ´åãããã«ããã¤ãã® Array ã¡ã½ãããããã«ã³ãã¼ãããå ´åãããã¾ãã
ä¾
let obj = {
0: "Hello",
1: "world!",
length: 2,
};
obj.join = Array.prototype.join;
alert( obj.join(',') ); // Hello,world!
çµã¿è¾¼ã¿ã® join ã¡ã½ããã®å
é¨ã¢ã«ã´ãªãºã ã¯ãæ£ããã¤ã³ããã¯ã¹ã¨ length ããããã£ã®ã¿ãèæ
®ãããããããã¯æ©è½ãã¾ãããªãã¸ã§ã¯ãããããã«é
åãã©ããã¯ãã§ãã¯ãã¾ãããå¤ãã®çµã¿è¾¼ã¿ã¡ã½ããã¯ãã®ããã«ãªã£ã¦ãã¾ãã
å¥ã®å¯è½æ§ã¯ãobj.__proto__ ã Array.prototype ã«è¨å®ãããã¨ã§ç¶æ¿ãããã¨ã§ãããã«ãããã¹ã¦ã®ãArray ã¡ã½ããã¯èªåçã« obj ã§å©ç¨å¯è½ã«ãªãã¾ãã
ã§ãããobj ãæ¢ã«å¥ã®ãªãã¸ã§ã¯ããç¶æ¿ãã¦ããå ´åã«ã¯ããã¯ä¸å¯è½ã§ããä¸åº¦ã«1ã¤ã®ãªãã¸ã§ã¯ãããç¶æ¿ã§ãã¾ããã
åç¨ã¡ã½ããã¯æè»ã§ãããå¿ è¦ã§ããã°ç°ãªããªãã¸ã§ã¯ãããæ©è½ãæ··ãããã¨ãå¯è½ã§ãã
ãµããª
- ãã¹ã¦ã®çµã¿è¾¼ã¿ãªãã¸ã§ã¯ãã¯åããã¿ã¼ã³ã«å¾ãã¾ãã:
- ã¡ã½ããã¯ãããã¿ã¤ãã«ä¿æããã¦ãã¾ã(
Array.prototype,Object.prototype,Date.prototypeãªã©)ã - ãªãã¸ã§ã¯ãèªèº«ã¯ãã¼ã¿ã®ã¿ãä¿æãã¾ã(é åã¢ã¤ãã ããªãã¸ã§ã¯ãããããã£ãæ¥ä»)ã
- ã¡ã½ããã¯ãããã¿ã¤ãã«ä¿æããã¦ãã¾ã(
- ããªããã£ããã¾ãã©ããã¼ãªãã¸ã§ã¯ãã®ãããã¿ã¤ãã«ã¡ã½ãããä¿æãã¾ãã:
Number.prototype,String.prototype,Boolean.prototypeãundefinedã¨nullã«ã ãã¯ã©ããã¼ãªãã¸ã§ã¯ãã¯ããã¾ããã - çµã¿è¾¼ã¿ã®ãããã¿ã¤ãã夿´ããããæ°ããã¡ã½ãããå®è£ ãããã¨ãã§ãã¾ãã ããããããã夿´ãããã¨ã¯ãå§ããã¾ããã ããããå¯ä¸è¨±å¯ãããã±ã¼ã¹ã¯ãæ°ããæ¨æºã追å ããããã®ã®ãã¾ã ã¨ã³ã¸ã³ã®JavaScriptã¡ã½ããã§ã¯ãµãã¼ãããã¦ããªãã¨ãã ãã§ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã