ç§ãã¡ãå
¬éããŠãã翻蚳ã®è³æã®èè
ã¯ããããžã§ã¯ããéå§ããŠãããã«ã¯ã³ãŒããæžãå§ããªããšè¿°ã¹ãŠããŸãã ãŸãããããžã§ã¯ãã®ç®çãšå¢çã決å®ãã次ã«ãããžã§ã¯ããæã€ã¹ãæ©äŒãç¹å®ããŸãã ãã®åŸãããã«ã³ãŒããèšè¿°ãããããããããªãè€éãªãããžã§ã¯ãã®å Žåã¯ããã®åºç€ã圢æããé©åãªèšèšãã¿ãŒã³ãéžæããŸãã ãã®è³æã¯JavaScriptã®ãã¶ã€ã³ãã¿ãŒã³ã«é¢ãããã®ã§ãã äž»ã«åå¿è
ã®éçºè
åãã«èšèšãããŠããŸãã

ãã¶ã€ã³ãã¿ãŒã³ãšã¯äœã§ããïŒ
ãœãããŠã§ã¢éçºã®åéã§ã¯ãèšèšãã¿ãŒã³ã¯ãé »ç¹ã«çºçããã³ã³ããã¹ãå
ã®èšèšåé¡ã®è§£æ±ºçã§ãããå埩å¯èœãªã¢ãŒããã¯ãã£èšèšã§ãã èšèšãã¿ãŒã³ã¯ãããã®ãœãããŠã§ã¢éçºè
ã®çµéšã®èŠçŽã§ãã èšèšãã¿ãŒã³ã¯ãããã°ã©ã ã®äœæã«å¿ããäžçš®ã®ãã¿ãŒã³ãšèããããšãã§ããŸãã
èšèšãã¿ãŒã³ãå¿
èŠãªçç±
å€ãã®ããã°ã©ããŒã¯ããã¶ã€ã³ãã¿ãŒã³ã¯æéã®ç¡é§ã ãšèããŠããããåã«ããããæ£ããé©çšããæ¹æ³ãç¥ããªããã®ããããã§ãã ãã ããé©åãªãã¿ãŒã³ã䜿çšãããšãããããããããç解ããããã³ãŒããäœæããã®ã«åœ¹ç«ã¡ãŸãããã®ã³ãŒãã¯ããã®ç解ããããã«ãããä¿å®ã容æã«ãªããŸãã
ããã§æãéèŠãªããšã¯ãããããããã¿ãŒã³ã䜿çšãããšããœãããŠã§ã¢éçºè
ããä»ã®äººã®ã³ãŒãã解æããå Žåãªã©ãéåžžã«åœ¹ç«ã€æåãªçšèªã®èŸæžã®ãããªãã®ã«ãªãããšã§ãã ãã¿ãŒã³ã¯ããããžã§ã¯ãã®ããã€ã¹ãææ¡ããããšããŠãã人ã«ãšã£ãŠãããã°ã©ã ã®ç¹å®ã®æçã®ç®çãæããã«ããŸãã
ããšãã°ããDecoratorããã¿ãŒã³ã䜿çšãããšãç¹å®ã®ã³ãŒããã©ã®ã¿ã¹ã¯ã解決ããã®ãããªããããå¿
èŠãªã®ãããããžã§ã¯ãã«æ¥ãæ°ããããã°ã©ããŒã«ããã«ç¥ãããŸãã ããã«ããããã®ãããªããã°ã©ããŒã¯ãå
éšæ§é ãç解ããããšããã®ã§ã¯ãªããããã°ã©ã ã解決ããå®éã®ã¿ã¹ã¯ã«ããå€ãã®æéãå²ãããšãã§ããŸãã
ãã¶ã€ã³ãã¿ãŒã³ãšãã®çšéãç解ããã®ã§ã次ã«ãã¿ãŒã³èªäœãšJavaScriptã䜿çšããå®è£
ã®èª¬æã«é²ã¿ãŸãã
ãã¿ãŒã³ãã¢ãžã¥ãŒã«ã
ã¢ãžã¥ãŒã«ã¯ãä»ã®ãããžã§ã¯ãã³ãŒãã«åœ±é¿ãäžããããšãªãå€æŽã§ããç¬ç«ããã³ãŒãã§ãã ããã«ãã¢ãžã¥ãŒã«ã¯ãã¢ãžã¥ãŒã«ã§å®£èšãããå€æ°ã«å¯ŸããŠåå¥ã®å¯èŠé åãäœæãããããå¯èŠé åã®æ±æãªã©ã®çŸè±¡ãåé¿ã§ããŸãã ãããããžã§ã¯ãçšã«äœæãããã¢ãžã¥ãŒã«ã¯ããã®ã¡ã«ããºã ãæ®éçã§ãç¹å®ã®ãããžã§ã¯ãã®æ©èœã«çµã³ä»ããããŠããªãå Žåãä»ã®ãããžã§ã¯ãã§åå©çšã§ããŸãã
ã¢ãžã¥ãŒã«ã¯ãææ°ã®JavaScriptã¢ããªã±ãŒã·ã§ã³ã®äžå¯æ¬ ãªéšåã§ãã ãããã¯ãã³ãŒãã®ã¯ãªãŒã³ããç¶æããã³ãŒããæå³ã®ãããã©ã°ã¡ã³ãã«åé¢ããæŽçããã®ã«åœ¹ç«ã¡ãŸãã JavaScriptã«ã¯ã¢ãžã¥ãŒã«ãäœæããå€ãã®æ¹æ³ãããããã®ãã¡ã®1ã€ã¯ãã¢ãžã¥ãŒã«ããã¿ãŒã³ã§ãã
ä»ã®ããã°ã©ãã³ã°èšèªãšã¯ç°ãªããJavaScriptã«ã¯ã¢ã¯ã»ã¹ä¿®é£ŸåããããŸããã ã€ãŸããå€æ°ããã©ã€ããŒããŸãã¯ãããªãã¯ãšããŠå®£èšããããšã¯ã§ããŸããã ãã®çµæããã¢ãžã¥ãŒã«ããã¿ãŒã³ã¯ãã«ãã»ã«åã®æŠå¿µããšãã¥ã¬ãŒãããããã«ã䜿çšãããŸãã
ãã®ãã¿ãŒã³ã§ã¯ãIIFEïŒImmediately-Invoked Functional ExpressionïŒãã¯ããŒãžã£ãŒãããã³é¢æ°ã¹ã³ãŒãã䜿çšããŠãã®æŠå¿µãæš¡å£ããŸãã äŸïŒ
const myModule = (function() { const privateVariable = 'Hello World'; function privateMethod() { console.log(privateVariable); } return { publicMethod: function() { privateMethod(); } } })(); myModule.publicMethod();
IIFEãããã®ã§ãã³ãŒãã¯ããã«å®è¡ãããåŒã«ãã£ãŠè¿ããããªããžã§ã¯ãã¯å®æ°
myModule
å²ãåœãŠãããŸãã ã¯ããŒãžã£ããããšããäºå®ã«ãããè¿ããããªããžã§ã¯ãã¯ãIIFEãå®äºããåŸã§ããIIFEå
ã§å®£èšãããé¢æ°ãšå€æ°ã«ã¢ã¯ã»ã¹ã§ããŸãã
ãã®çµæãIIFEå
ã§å®£èšãããå€æ°ãšé¢æ°ã¯ããããã«é¢ããŠå€éšã¹ã³ãŒãã«ããã¡ã«ããºã ããé ãããŸãã ãããã¯ã
myModule
å®æ°ã®ãã©ã€ããŒããšã³ãã£ãã£ã§ããããšã
myModule
ã
ãã®ã³ãŒããå®è¡ããããšã
myModule
ã¯æ¬¡ã®ããã«ãªããŸãã
const myModule = { publicMethod: function() { privateMethod(); }};
ã€ãŸãããã®å®æ°ãåç
§ããŠã
publicMethod()
ãªããžã§ã¯ãã¡ãœãããåŒã³åºãããšãã§ããŸãããã®ã¡ãœããã¯ã
privateMethod()
ãã©ã€ããŒãã¡ãœãããåŒã³åºããŸãã äŸïŒ
// 'Hello World' module.publicMethod();
ãªãŒãã³ã¢ãžã¥ãŒã«ãã¿ãŒã³
Revealing Moduleãã¿ãŒã³ã¯ãChristian Heilmannãææ¡ããModuleãã¿ãŒã³ã®ãããã«æ¹åãããããŒãžã§ã³ã§ãã ãã¢ãžã¥ãŒã«ããã¿ãŒã³ã®åé¡ã¯ããã©ã€ããŒãé¢æ°ãšå€æ°ã«ã¢ã¯ã»ã¹ããããã ãã«ãããªãã¯é¢æ°ãäœæããå¿
èŠãããããšã§ãã
ãã®ãã¿ãŒã³ã§ã¯ãå
¬éãããè¿ããããªããžã§ã¯ãã®ããããã£ã«ãã©ã€ããŒãé¢æ°ãå²ãåœãŠãŸãã ãã®ããããã®ãã¿ãŒã³ã¯ããªãŒãã³ã¢ãžã¥ãŒã«ããšåŒã°ããŸãã äŸãèããŠã¿ãŸãããïŒ
const myRevealingModule = (function() { let privateVar = 'Peter'; const publicVar = 'Hello World'; function privateFunction() { console.log('Name: '+ privateVar); } function publicSetName(name) { privateVar = name; } function publicGetName() { privateFunction(); } return { setName: publicSetName, greeting: publicVar, getName: publicGetName }; })(); myRevealingModule.setName('Mark');
ãã®ãã¿ãŒã³ãé©çšãããšãã¢ãžã¥ãŒã«ã®ã©ã®é¢æ°ãšå€æ°ãå
¬éãããŠãããããããããããªããã³ãŒãã®å¯èªæ§ãåäžããŸãã
IIFEã®å®è¡åŸã
myRevealingModule
ã¯æ¬¡ã®ããã«ãªããŸãã
const myRevealingModule = { setName: publicSetName, greeting: publicVar, getName: publicGetName };
ããšãã°ã
myRevealingModule.setName('Mark')
ã¡ãœãããåŒã³åºãããšãã§ããŸããããã¯ã
publicSetName
å
éšé¢æ°ãžã®åç
§ã§ãã
myRevealingModule.getName()
ã¡ãœããã¯ãå
éšé¢æ°
publicGetName
ãŸãã äŸïŒ
myRevealingModule.setName('Mark');
ãã¢ãžã¥ãŒã«ããã¿ãŒã³ããããã¢ãžã¥ãŒã«ãéãããã¿ãŒã³ã®å©ç¹ãèæ
®ããŠãã ããã
- ããªãŒãã³ã¢ãžã¥ãŒã«ãã䜿çšãããšãã¢ãžã¥ãŒã«ã®ãããªãã¯ãªé衚瀺ãšã³ãã£ãã£ãäœæãïŒå¿
èŠã«å¿ããŠåã³é衚瀺ã«ããïŒãIIFEã®åŸã«è¿ããããªããžã§ã¯ãã®åè¡ãããããå€æŽã§ããŸãã
- è¿ããããªããžã§ã¯ãã«ã¯é¢æ°å®çŸ©ãå«ãŸããŠããŸããã ããããã£åã®å³åŽã¯ãã¹ãŠIIFEã§å®çŸ©ãããŠããŸãã ããã«ãããã³ãŒããã¯ãªãŒã³ã§èªã¿ãããä¿ã€ããšãã§ããŸãã
ES6ã®ã¢ãžã¥ãŒã«
ES6æšæºããªãªãŒã¹ããããŸã§ãJavaScriptã«ã¯ã¢ãžã¥ãŒã«ãæäœããããã®æšæºããŒã«ããããŸããã§ããããã®ãããéçºè
ã¯ãµãŒãããŒãã£ã®ã©ã€ãã©ãªãŸãã¯ãã¢ãžã¥ãŒã«ããã¿ãŒã³ã䜿çšããŠé©åãªã¡ã«ããºã ãå®è£
ããå¿
èŠããããŸããã ããããES6ã®ç»å Žã«ãããæšæºã¢ãžã¥ãŒã«ã·ã¹ãã ãJavaScriptã«ç»å ŽããŸããã
ES6ã¢ãžã¥ãŒã«ã¯ãã¡ã€ã«ã«ä¿åãããŸãã 1ã€ã®ãã¡ã€ã«ã«å«ããããšãã§ããã¢ãžã¥ãŒã«ã¯1ã€ã ãã§ãã ã¢ãžã¥ãŒã«å
ã®ãã¹ãŠã¯ããã©ã«ãã§ãã©ã€ããŒãã§ãã é¢æ°ãå€æ°ãããã³ã¯ã©ã¹ã¯ã
export
ããŒã¯ãŒãã䜿çšããŠå
¬éã§ããŸãã ã¢ãžã¥ãŒã«å
ã®ã³ãŒãã¯åžžã«å³æ Œã¢ãŒãã§å®è¡ãããŸãã
âãšã¯ã¹ããŒãã¢ãžã¥ãŒã«
ã¢ãžã¥ãŒã«ã§å®£èšãããé¢æ°ãŸãã¯å€æ°ããšã¯ã¹ããŒãããã«ã¯ã2ã€ã®æ¹æ³ããããŸãã
- ãšã¯ã¹ããŒãã¯ãé¢æ°ãŸãã¯å€æ°ã宣èšããåã«
export
ããŒã¯ãŒããè¿œå ããããšã«ããè¡ãããŸãã äŸïŒ
// utils.js export const greeting = 'Hello World'; export function sum(num1, num2) { console.log('Sum:', num1, num2); return num1 + num2; } export function subtract(num1, num2) { console.log('Subtract:', num1, num2); return num1 - num2; } // - function privateLog() { console.log('Private Function'); }
- ãšã¯ã¹ããŒãã¯ã
export
ãããé¢æ°ãšå€æ°ã®ååããªã¹ãããã³ãŒãã®æåŸã«export
ããŒã¯ãŒããè¿œå ããããšã«ããè¡ãããŸãã äŸïŒ
// utils.js function multiply(num1, num2) { console.log('Multiply:', num1, num2); return num1 * num2; } function divide(num1, num2) { console.log('Divide:', num1, num2); return num1 / num2; } // function privateLog() { console.log('Private Function'); } export {multiply, divide};
âã€ã³ããŒãã¢ãžã¥ãŒã«
ãšã¯ã¹ããŒãããæ¹æ³ã2ã€ããããã«ãã¢ãžã¥ãŒã«ãã€ã³ããŒãããæ¹æ³ã2ã€ãããŸãã ããã¯ã
import
ããŒã¯ãŒãã䜿çšããŠè¡ãããŸãã
- éžæããè€æ°ã®ã¢ã€ãã ãã€ã³ããŒãããŸãã äŸïŒ
// main.js // import { sum, multiply } from './utils.js'; console.log(sum(3, 7)); console.log(multiply(3, 7));
- ã¢ãžã¥ãŒã«ããšã¯ã¹ããŒããããã¹ãŠãã€ã³ããŒãããŸãã äŸïŒ
// main.js // , import * as utils from './utils.js'; console.log(utils.sum(3, 7)); console.log(utils.multiply(3, 7));
exportedãšã¯ã¹ããŒãããã³ã€ã³ããŒãããããšã³ãã£ãã£ã®ãšã€ãªã¢ã¹
ã³ãŒãã«ãšã¯ã¹ããŒããããé¢æ°ãŸãã¯å€æ°ã®ååãè¡çªãåŒãèµ·ããå¯èœæ§ãããå Žåããããã¯ãšã¯ã¹ããŒãäžãŸãã¯ã€ã³ããŒãäžã«å€æŽã§ããŸãã
ãšã¯ã¹ããŒãäžã«ãšã³ãã£ãã£ã®ååãå€æŽããã«ã¯ã次ãå®è¡ã§ããŸãã
// utils.js function sum(num1, num2) { console.log('Sum:', num1, num2); return num1 + num2; } function multiply(num1, num2) { console.log('Multiply:', num1, num2); return num1 * num2; } export {sum as add, multiply};
ã€ã³ããŒãäžã«ãšã³ãã£ãã£ã®ååãå€æŽããã«ã¯ã次ã®æ§æã䜿çšãããŸãã
// main.js import { add, multiply as mult } from './utils.js'; console.log(add(3, 7)); console.log(mult(3, 7));
ã·ã³ã°ã«ãã³ãã¿ãŒã³
ãã·ã³ã°ã«ãã³ããŸãã¯ãã·ã³ã°ã«ãã³ããã¿ãŒã³ã¯ãåäžã®ã³ããŒã«ã®ã¿ååšã§ãããªããžã§ã¯ãã§ãã ãã®ãã¿ãŒã³ã®ã¢ããªã±ãŒã·ã§ã³ã®äžéšãšããŠãç¹å®ã®ã¯ã©ã¹ã®æ°ããã€ã³ã¹ã¿ã³ã¹ããŸã äœæãããŠããªãå Žåã¯äœæãããŸãã ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãæ¢ã«ååšããå Žåãã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¢ã¯ã»ã¹ããããšãããšã察å¿ãããªããžã§ã¯ããžã®åç
§ãè¿ãããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒãžã®åŸç¶ã®åŒã³åºãã¯ãåžžã«åããªããžã§ã¯ããè¿ããŸãã
å®éããã·ã³ã°ã«ãã³ããã¿ãŒã³ãšåŒã°ãããã®ã¯åžžã«JavaScriptã«ãããŸããããã·ã³ã°ã«ãã³ãã§ã¯ãªãããªããžã§ã¯ããªãã©ã«ããšåŒã°ããŸãã äŸãèããŠã¿ãŸãããïŒ
const user = { name: 'Peter', age: 25, job: 'Teacher', greet: function() { console.log('Hello!'); } };
JavaScriptã®åãªããžã§ã¯ãã¯ç¬èªã®ã¡ã¢ãªé åãå æããä»ã®ãªããžã§ã¯ããšå
±æããªãããã
user
å€æ°ã«ã¢ã¯ã»ã¹ãããã³ã«ãåããªããžã§ã¯ããžã®ãªã³ã¯ãååŸããŸãã
ã·ã³ã°ã«ãã³ãã¿ãŒã³ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ã䜿çšããŠå®è£
ã§ããŸãã 次ã®ããã«ãªããŸãã
let instance = null; function User(name, age) { if(instance) { return instance; } instance = this; this.name = name; this.age = age; return instance; } const user1 = new User('Peter', 25); const user2 = new User('Mark', 24);
ã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ãåŒã³åºããããšãæåã«
instance
ãªããžã§ã¯ããååšãããã©ããã確èªãããŸãã 察å¿ããå€æ°ãåæåãããŠããªãå Žåã
this
instance
æžã蟌ãŸã
instance
ã å€æ°ããã§ã«ãªããžã§ã¯ããžã®åç
§ãæã£ãŠããå Žåãã³ã³ã¹ãã©ã¯ã¿ãŒã¯åã«
instance
ãã€ãŸãæ¢åã®ãªããžã§ã¯ããžã®åç
§ãè¿ããŸãã
ã·ã³ã°ã«ãã³ãã¿ãŒã³ã¯ãã¢ãžã¥ãŒã«ãã¿ãŒã³ã䜿çšããŠå®è£
ã§ããŸãã äŸïŒ
const singleton = (function() { let instance; function User(name, age) { this.name = name; this.age = age; } return { getInstance: function(name, age) { if(!instance) { instance = new User(name, age); } return instance; } } })(); const user1 = singleton.getInstance('Peter', 24); const user2 = singleton.getInstance('Mark', 26);
ããã§ã¯ã
singleton.getInstance()
ã¡ãœãããåŒã³åºããŠã
user
æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãæ¢ã«ååšããå Žåããã®ã¡ãœããã¯åçŽã«ãããè¿ããŸãã ãã®ãããªãªããžã§ã¯ãããŸã ãªãå Žåãã¡ãœããã¯
User
ã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ãåŒã³åºãããšã«ããããªããžã§ã¯ãã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã
å·¥å Žãã¿ãŒã³
Factoryãã¿ãŒã³ã¯ããã¡ã¯ããªã¡ãœãããšåŒã°ãããã®ã䜿çšããŠãªããžã§ã¯ããäœæããŸãã ãªããžã§ã¯ãã®äœæã«äœ¿çšãããã¯ã©ã¹ãŸãã¯ã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ãæå®ããå¿
èŠã¯ãããŸããã
ãã®ãã¿ãŒã³ã¯ãäœæã®ããžãã¯ãå
¬éããå¿
èŠããªãå Žåã«ãªããžã§ã¯ããäœæããããã«äœ¿çšãããŸãã ç¹å®ã®æ¡ä»¶ã«å¿ããŠç°ãªããªããžã§ã¯ããäœæããå¿
èŠãããå Žåã¯ãFactoryãã¿ãŒã³ã䜿çšã§ããŸãã äŸïŒ
class Car{ constructor(options) { this.doors = options.doors || 4; this.state = options.state || 'brand new'; this.color = options.color || 'white'; } } class Truck { constructor(options) { this.doors = options.doors || 4; this.state = options.state || 'used'; this.color = options.color || 'black'; } } class VehicleFactory { createVehicle(options) { if(options.vehicleType === 'car') { return new Car(options); } else if(options.vehicleType === 'truck') { return new Truck(options); } } }
ããã§ã¯ãç¹å®ã®æšæºå€ã®äœ¿çšãæäŸãã
Car
ã¯ã©ã¹ãš
Truck
ã¯ã©ã¹ãäœæãããŸãã ãããã¯ã
car
ãš
truck
ãªããžã§ã¯ããäœæããããã«äœ¿çšãããŸãã
VehicleFactory
ã¯ã©ã¹ãããã§å®£èšãããŸããããã¯ã
vehicleType
ããããã£ã®åæã«åºã¥ããŠæ°ãããªããžã§ã¯ããäœæããããã«äœ¿çšããã
options
ã
options
ããŠãªããžã§ã¯ãã§è¿ããªããžã§ã¯ãã®å¯Ÿå¿ããã¡ãœããã«æž¡ãã
options
ã ããããã¹ãŠäœ¿çšããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
const factory = new VehicleFactory(); const car = factory.createVehicle({ vehicleType: 'car', doors: 4, color: 'silver', state: 'Brand New' }); const truck= factory.createVehicle({ vehicleType: 'truck', doors: 2, color: 'white', state: 'used' }); // Car {doors: 4, state: "Brand New", color: "silver"} console.log(car); // Truck {doors: 2, state: "used", color: "white"} console.log(truck);
VehicleFactory
ã¯ã©ã¹ã®
factory
ãªããžã§ã¯ãã¯ã
VehicleFactory
ã§
VehicleFactory
ã ãã®åŸã
factory.createVehicle()
ã¡ãœãããåŒã³åºããŠã
vehicleType
ããããã£ã
car
ãŸãã¯
truck
èšå®ããã
options
ãªããžã§ã¯ããæž¡ãããšã«ããã
Car
ãŸãã¯
Truck
ã¯ã©ã¹ã®ãªããžã§ã¯ããäœæã§ããŸãã
ãã³ã¬ãŒã¿ãã¿ãŒã³
Decoratorãã¿ãŒã³ã¯ãæ¢åã®ã¯ã©ã¹ãŸãã¯ã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ãå€æŽããã«ãªããžã§ã¯ãã®æ©èœãæ¡åŒµããããã«äœ¿çšãããŸãã ãã®ãã¿ãŒã³ã䜿çšãããšããªããžã§ã¯ãã®äœæãæ
åœããã³ãŒããå€æŽããã«ãç¹å®ã®æ©èœããªããžã§ã¯ãã«è¿œå ã§ããŸãã
ãã®ãã¿ãŒã³ã䜿çšããç°¡åãªäŸã次ã«ç€ºããŸãã
function Car(name) { this.name = name; // this.color = 'White'; } // , const tesla= new Car('Tesla Model 3'); // - tesla.setColor = function(color) { this.color = color; } tesla.setPrice = function(price) { this.price = price; } tesla.setColor('black'); tesla.setPrice(49000); // black console.log(tesla.color);
次ã«ããã®ãã¿ãŒã³ã®é©çšã®å®çšçãªäŸãèããŠã¿ãŸãããã è»ã®ã³ã¹ãã¯ããã®æ©èœãå©çšå¯èœãªè¿œå æ©èœã«äŸåãããšä»®å®ããŸãã Decoratorãã¿ãŒã³ã䜿çšããã«ãããã®è»ã説æããã«ã¯ããããã®è¿œå æ©èœã®ããŸããŸãªçµã¿åããã«å¯ŸããŠç°ãªãã¯ã©ã¹ãäœæããå¿
èŠããããããããã«è»ã®ã³ã¹ããèŠã€ããæ¹æ³ããããŸãã ããšãã°ã次ã®ããã«ãªããŸãã
class Car() { } class CarWithAC() { } class CarWithAutoTransmission { } class CarWithPowerLocks { } class CarWithACandPowerLocks { }
åé¡ã®ãã¿ãŒã³ã®ãããã§ãåºæ¬ã¯ã©ã¹ã®
Car
ãèšè¿°ããåºæ¬ã¯ã©ã¹
Car
äœæã§ããŸãããã®è»ã®å€ã¯ãäžå®ã®éã§è¡šãããŸãã ãã®åŸããã®ã¯ã©ã¹ã«åºã¥ããŠäœæãããæšæºãªããžã§ã¯ãã¯ããã³ã¬ãŒã¿é¢æ°ã䜿çšããŠå±éã§ããŸãã ãã®æ©èœã«ãã£ãŠåŠçãããæšæºã®ãè»ãã¯æ°ããæ©äŒãç²åŸããããã«ãã®äŸ¡æ Œã«åœ±é¿ãäžããŸãã ããšãã°ããã®ã¹ããŒã ã¯æ¬¡ã®ããã«å®è£
ã§ããŸãã
class Car { constructor() { // this.cost = function() { return 20000; } } } // - function carWithAC(car) { car.hasAC = true; const prevCost = car.cost(); car.cost = function() { return prevCost + 500; } } // - function carWithAutoTransmission(car) { car.hasAutoTransmission = true; const prevCost = car.cost(); car.cost = function() { return prevCost + 2000; } } // - function carWithPowerLocks(car) { car.hasPowerLocks = true; const prevCost = car.cost(); car.cost = function() { return prevCost + 500; } }
ããã§ã¯ãæåã«åºæ¬ã¯ã©ã¹
Car
ãäœæããŸããããã¯ãæšæºãšããŠè»ãè¡šããªããžã§ã¯ããäœæããããã«äœ¿çšãããŸãã 次ã«ãåºæ¬ããããã£
Car
ã¯ã©ã¹ã®ãªããžã§ã¯ããè¿œå ã®ããããã£ã§æ¡åŒµã§ããããã«ããããã€ãã®ãã³ã¬ãŒã¿é¢æ°ãäœæããŸãã ãããã®é¢æ°ã¯ã察å¿ãããªããžã§ã¯ãããã©ã¡ãŒã¿ãŒãšããŠåãåããŸãã ãã®åŸããªããžã§ã¯ãã«æ°ããããããã£ãè¿œå ããŠãè»ã«ã©ã®æ°ããæ©èœãè£
åãããã瀺ãããªããžã§ã¯ãã®
cost
é¢æ°ãåå®çŸ©ããŸããããã«ãããè»ã®æ°ããã³ã¹ããè¿ãããŸãã ãã®çµæãæšæºæ§æã®è»ã«æ°ãããã®ããè£
åãããããã«ã次ã®èšèšã䜿çšã§ããŸãã
const car = new Car(); console.log(car.cost()); carWithAC(car); carWithAutoTransmission(car); carWithPowerLocks(car);
ãã®åŸãæ¹åãããæ§æã§èªåè»ã®ã³ã¹ãã調ã¹ãããšãã§ããŸãã
// console.log(car.cost());
ãŸãšã
ãã®èšäºã§ã¯ãJavaScriptã§äœ¿çšãããããã€ãã®èšèšãã¿ãŒã³ã調ã¹ãŸããããå®éã«ã¯ãããŸããŸãªåé¡ã解決ããããã«äœ¿çšã§ãããã¿ãŒã³ããŸã ãããããããŸãã
ããã°ã©ããŒã«ãšã£ãŠããŸããŸãªãã¶ã€ã³ãã¿ãŒã³ã®ç¥èã¯éèŠã§ããããããã®é©åãªäœ¿çšãåæ§ã«éèŠã§ãã ãã¿ãŒã³ãšã¢ããªã±ãŒã·ã§ã³ã®ç¯å²ãç¥ã£ãŠããããã°ã©ããŒã¯ãèªåã®åã§ã¿ã¹ã¯ãåæããã©ã®ãããªãã¿ãŒã³ãããã解決ããã®ã«åœ¹ç«ã€ããç解ã§ããŸãã
芪æãªãèªè
ïŒ æãé »ç¹ã«äœ¿çšãããã¶ã€ã³ãã¿ãŒã³ã¯äœã§ããïŒ
