ãã®èšäºã¯ãä»ã®èšèªã®ç¶æ¿ã«ç²ŸéããŠãããJavaScriptã§ãã®ãããªåäœããšãã¥ã¬ãŒãããè©Šã¿ã«ééãã人ãããã³å®è£ ãæ¯èŒããŠããŸããŸãªã©ã€ãã©ãªãšãã¬ãŒã ã¯ãŒã¯ã®å éšãèŠãããšã«èå³ããã人ã察象ãšããŠããŸãã åçŽãªæ¡åŒµæ©èœã¯ãéåžžã«ç°ãªãæ¹æ³ã§å®è£ ã§ããããšãããããŸããã å€ãã®å Žåããã®å Žåã¯ééããçºçããŸãïŒä»¥äžã®ãæãäžè¬çãªééããã®æ®µèœãåç §ïŒã
ãã®èšäºã¯ã Today Software Magazineã®çããããªãã¬ãŒã³ããŒã·ã§ã³ã§è±èªã§å ¥æã§ããŸãã
å€å žçãªç¶æ¿ã«ã€ããŠ
ã¯ã©ã·ãã¯ã¯ãOOPã®ç¶æ¿ãšããŠç解ãããŠããŸãã ãåç¥ã®ããã«ãçŽç²ãªJavaScriptã«ã¯å€å žçãªç¶æ¿ã¯ãããŸããã ããã«ãã¯ã©ã¹ã®æŠå¿µãæ¬ ããŠããŸãã çŸåšã®EcmaScriptä»æ§ã§ã¯ãã¯ã©ã¹ãæäœããããã®æ§ææ§é ãè¿œå ãããŠããŸãããå®éã«ã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ãšãããã¿ã€ãã䜿çšãããšããäºå®ã¯å€ãããŸããã ãããã£ãŠããã®ææ³ã¯ãæ¬äŒŒå€å žçãç¶æ¿ãšåŒã°ããããšããããããŸãã ããããå¯äžã®ç®æšãã€ãŸãéåžžã®OOPã¹ã¿ã€ã«ã§ã³ãŒããæ瀺ããããšãè¿œæ±ããŸãã
ã¯ã©ã·ãã¯ã«å ããŠãããŸããŸãªç¶æ¿ææ³ããããŸããæ©èœããããã¿ã€ãïŒçŽç²ãªåœ¢åŒïŒããã¡ã¯ããªãŒãããã¯ã¹ã€ã³ã䜿çšããŸãã éçºè ã®éã§é«ã人æ°ãç²åŸããŠããç¶æ¿ã®æŠå¿µãã®ãã®ãæ¹å€ãããŠãããå€ãã®å Žåãåççãªä»£æ¿æ§æãšã¯å¯Ÿç §çã§ãã
ããã«ãç¶æ¿ã¯ãå€å žçãªã¹ã¿ã€ã«ã§ã¯ãäžèœè¬ã§ã¯ãããŸããã ãã®å®çŸå¯èœæ§ã¯ãç¹å®ã®ãããžã§ã¯ãã®ç¹å®ã®ç¶æ³ã«äŸåããŸãã ãã ãããã®èšäºã§ã¯ããã®ã¢ãããŒãã®é·æãšçæã®åé¡ãæãäžããããšã¯ãããæ£ãã䜿çšããæ¹æ³ã«çŠç¹ãåœãŠãŸãã
æ¯èŒåºæº
ãã®ãããåœåã¯ãµããŒãããŠããªãèšèªã§OOPãšåŸæ¥ã®ç¶æ¿ã䜿çšããããšã«ããŸããã ãã®æ±ºå®ã¯ãå€ãã®å Žåãä»ã®èšèªã§OOPã«æ £ããŠããéçºè ã«ãã£ãŠå€§èŠæš¡ãããžã§ã¯ãã§è¡ãããŸãã ãŸããå€ãã®å€§èŠæš¡ãªãã¬ãŒã ã¯ãŒã¯ã§äœ¿çšãããŠããŸãïŒBackboneãEmber JSãªã©ãããã³ææ°ã®EcmaScriptä»æ§ã
ç¶æ¿ã®é©çšã«é¢ããæåã®ã¢ããã€ã¹ã¯ãEcmaScript 6ã§èª¬æãããŠããããã«ãããŒã¯ãŒãclassãextendsãconstructorãªã©ãšãšãã«äœ¿çšããããšã§ãã ãã®ãããªæ©äŒãããå Žåãå€å žçãªç¶æ¿ãå®è£ ããäžè¬çãªäŸãèŠãŠã¿ãŸããããããã«èªãããšã¯ã§ããŸãããããã¯ã³ãŒãã®èªã¿ããããšããã©ãŒãã³ã¹ã®ç¹ã§æè¯ã®ãªãã·ã§ã³ã§ãã 以äžã®èª¬æã¯ãã¹ãŠãES5ã䜿çšããŠãããžã§ã¯ããæ¢ã«éå§ãããŠãããæ°ããããŒãžã§ã³ãžã®ç§»è¡ãå©çšã§ããªãããã«æãããå Žåã«ãå€ãä»æ§ã䜿çšããå Žåã«åœ¹ç«ã¡ãŸãã
5ã€ã®åŽé¢ã§åæããŸãã
- ã¡ã¢ãªå¹çã
- ããã©ãŒãã³ã¹ã
- éçããããã£ãšã¡ãœããã
- ã¹ãŒããŒã¯ã©ã¹ãžã®ãªã³ã¯ã
- å粧åã®è©³çŽ°ã
ãã¡ããããŸãæåã«ã䜿çšãããã³ãã¬ãŒããã¡ã¢ãªãšããã©ãŒãã³ã¹ã®ç¹ã§å¹æçã§ããããšã確èªããå¿ èŠããããŸãã ãã®ç¹ã§äººæ°ã®ãããã¬ãŒã ã¯ãŒã¯ã®äŸã«é¢ããŠã¯ãç¹ã«äžæºã¯ãããŸããããå®éã«ã¯ã誀ã£ãäŸãã¡ã¢ãªãªãŒã¯ãã¹ã¿ãã¯ã®æé·ã«ã€ãªããããšããããããŸããããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã
ãªã¹ããããŠããæ®ãã®åºæºã¯ãã³ãŒãã®äœ¿ãããããšèªã¿ãããã«é¢ãããã®ã§ãã
æ§æãšæ©èœãä»ã®èšèªã®å€å žçãªç¶æ¿ã«ããè¿ãå®è£ ããããã䟿å©ãªããã®ãšèããŸãã ãã®ãããã¹ãŒããŒã¯ã©ã¹ïŒããŒã¯ãŒãsuperïŒãžã®ãªã³ã¯ã¯ãªãã·ã§ã³ã§ãããç¶æ¿ã®å®å šãªãšãã¥ã¬ãŒã·ã§ã³ã«ã¯ãã®ååšãæãŸããã§ãã è£ é£Ÿçãªè©³çŽ°ãšã¯ãã³ãŒãã®äžè¬çãªèšèšããããã°ã®å©äŸ¿æ§ã
instanceof
æŒç®åã®äœ¿çšãªã©ãæå³ã
instanceof
ã
Babelã®_inheritsé¢æ°
EcmaScript 6ã®ç¶æ¿ãšãBabelã䜿çšããŠES5ã§ã³ãŒããã³ã³ãã€ã«ãããšãã«åŸããããã®ãèæ ®ããŠãã ããã
以äžã¯ãES6ã®ã¯ã©ã¹æ¡åŒµã®äŸã§ãã
class BasicClass { static staticMethod() {} constructor(x) { this.x = x; } someMethod() {} } class DerivedClass extends BasicClass { static staticMethod() {} constructor(x) { super(x); } someMethod() { super.someMethod(); } }
ã芧ã®ãšãããæ§æã¯ä»ã®OOPèšèªã«äŒŒãŠããŸãããåãšã¢ã¯ã»ã¹ä¿®é£Ÿåããªãããšãé€ããŠèããããŸãã ãããŠãããã¯ã³ã³ãã€ã©ãŒã§ES6ã䜿çšããããšã®ãŠããŒã¯ãã§ãã䟿å©ãªæ§æãè³Œå ¥ããäœè£ããããåæã«åºåã§ES5ã§åäœããã³ãŒããååŸã§ããŸãã 次ã®äŸã¯ã©ããããã®ãããªæ§æã®åçŽããèªã£ãŠããŸããã ãããã§ã¯ãç¶æ¿é¢æ°ã¯æ§æå€æãªãã§ãå®æãããã©ãŒã ã§ããã«å®è£ ãããŸãã
Babelã³ã³ãã€ã©ã¯ãåçŽãª
_inherits
é¢æ°ã䜿çšããŠç¶æ¿ãå®è£ ããŸãã
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
ããã§ã®äž»ãªãã€ã³ãã¯ã次ã®è¡ã«çž®å°ã§ããŸãã
subClass.prototype = Object.create(superClass.prototype);
ãã®åŒã³åºãã¯ãæå®ããããããã¿ã€ãã§ãªããžã§ã¯ããäœæããŸãã
subClass
ã³ã³ã¹ãã©ã¯ã¿ãŒã®
prototype
ããããã£ã¯ããã®ãããã¿ã€ãã
superclass
芪ã¯ã©ã¹ã®
prototype
ã§ããæ°ãããªããžã§ã¯ããæããŸãã ãããã£ãŠãããã¯ããœãŒã¹ã³ãŒãã§å€å žãšããŠåœè£ ãããåçŽãªãããã¿ã€ãç¶æ¿ã§ãã
次ã®ã³ãŒãè¡ã¯ãã¯ã©ã¹ã®éçãã£ãŒã«ãã®ç¶æ¿ãå®è£ ããŠããŸãã
Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
芪ã¯ã©ã¹ïŒã€ãŸããé¢æ°ïŒã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãæ°ããã¯ã©ã¹ïŒã€ãŸããå¥ã®é¢æ°ïŒã®ã³ã³ã¹ãã©ã¯ã¿ãŒã®ãããã¿ã€ãã«ãªããŸãã ãããã£ãŠã芪ã¯ã©ã¹ã®ãã¹ãŠã®éçããããã£ãšã¡ãœããã¯ã掟çã¯ã©ã¹ããå©çšå¯èœã«ãªããŸãã
setPrototypeOf
é¢æ°ããªãå Žå
setPrototypeOf
Babelã¯
__proto__
衚瀺ã®
__proto__
ããããã£ãžã®ãããã¿ã€ãã®çŽæ¥æžã蟌ã¿ãæäŸããŸãããã®ææ³ã¯æšå¥šãããŸããããå€ããã©ãŠã¶ãŒã䜿çšããå Žåã®æåŸã®æ段ãšããŠé©ããŠããŸãã
éçããã³åçã®äž¡æ¹ã®ã¡ãœããã®èšé²ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãŸãã¯ãã®
prototype
ãžã®åç §ãåã«ã³ããŒããããš
_inherits
ã
_inherits
åŒã³åºããšã¯å¥ã«è¡ãããŸãã ç¬èªã®ç¶æ¿å®è£ ãäœæããå Žåããã®äŸãåºç€ãšããŠäœ¿çšãã
_inherits
é¢æ°ãžã®è¿œå åŒæ°ãšããŠåçããã³éçãã£ãŒã«ããæã€ãªããžã§ã¯ããè¿œå ã§ããŸãã
superããŒã¯ãŒãã¯ãçŽæ¥ãããã¿ã€ãåŒã³åºããã³ã³ãã€ã«ãããšãã«åçŽã«çœ®ãæããããŸãã ããšãã°ãäžèšã®äŸãã芪ã³ã³ã¹ãã©ã¯ã¿ãåŒã³åºããšã次ã®è¡ã«çœ®ãæããããŸãã
return _possibleConstructorReturn(this, (DerivedClass.__proto__ || Object.getPrototypeOf(DerivedClass)).call(this, x));
Babelã¯ãããã§ã¯åãäžããªãå€ãã®ãã«ããŒé¢æ°ã䜿çšããŸãã äžçªäžã®è¡ã¯ããã®åŒã³åºãã§ã€ã³ã¿ãŒããªã¿ãŒãçŸåšã®ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã®ãããã¿ã€ãïŒåºæ¬ã¯ã©ã¹ïŒäžèšåç §ïŒã®ã³ã³ã¹ãã©ã¯ã¿ãŒïŒãååŸãã
this
çŸåšã®ã³ã³ããã¹ãã§åŒã³åºããŸãã
çŽç²ãªES5ã§ã®ç¬èªã®å®è£ ã§ã¯ãã³ã³ãã€ã«ã¹ããŒãžã¯äœ¿çšã§ããŸããããããã£ãŠã芪ã¯ã©ã¹ãžã®äŸ¿å©ãªåç §ãåŸãããã«ãã³ã³ã¹ãã©ã¯ã¿ãŒãšãã®
prototype
ã«
_super
ãã£ãŒã«ããè¿œå ã§ããŸãã
function extend(subClass, superClass) { // ... subClass._super = superClass; subClass.prototype._super = superClass.prototype; }
Backbone JSã®æ¡åŒµæ©èœ
Backbone JSã¯ãã¢ãã«ããã¥ãŒãã³ã¬ã¯ã·ã§ã³ãªã©ã®ã©ã€ãã©ãªã¯ã©ã¹ã
extend
ãã
extend
æ©èœãæäŸããŸãã ãåžæã®å Žåã¯ãç¬èªã®ç®çã®ããã«åããããšãã§ããŸãã 以äžã¯ãBackbone 1.3.3ã®æ©èœ
extend
ã³ãŒãã§ãã
var extend = function(protoProps, staticProps) { var parent = this; var child; // The constructor function for the new subclass is either defined by you // (the "constructor" property in your `extend` definition), or defaulted // by us to simply call the parent constructor. if (protoProps && _.has(protoProps, 'constructor')) { child = protoProps.constructor; } else { child = function(){ return parent.apply(this, arguments); }; } // Add static properties to the constructor function, if supplied. _.extend(child, parent, staticProps); // Set the prototype chain to inherit from `parent`, without calling // `parent`'s constructor function and add the prototype properties. child.prototype = _.create(parent.prototype, protoProps); child.prototype.constructor = child; // Set a convenience property in case the parent's prototype is needed // later. child.__super__ = parent.prototype; return child; };
䜿çšäŸã¯æ¬¡ã®ãšããã§ãã
var MyModel = Backbone.Model.extend({ constructor: function() { // ; , // , Backbone.Model.apply(this, arguments); }, toJSON: function() { // , «__super__» MyModel.__super__.toJSON.apply(this, arguments); } }, { staticMethod: function() {} });
ãã®é¢æ°ã¯ãç¬èªã®ã³ã³ã¹ãã©ã¯ã¿ãŒãšéçãã£ãŒã«ãããµããŒãããåºæ¬ã¯ã©ã¹ã®æ¡åŒµæ©èœãå®è£ ããŸãã ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒé¢æ°ãè¿ããŸãã Babelã®äŸãšåæ§ã«ãç¶æ¿èªäœã¯æ¬¡ã®è¡ã§å®è£ ãããŸãã
child.prototype = _.create(parent.prototype, protoProps);
_.create()
é¢æ°ã¯ãUnderscore JSã©ã€ãã©ãªã«ãã£ãŠå®è£ ãããES6ã®
Object.create()
é¡äŒŒããŠããŸãã 2çªç®ã®åŒæ°ã«ããã
extend
é¢æ°ãåŒã³åºããããšãã«æž¡ããã
protoProps
ããããã£ãšã¡ãœãããããã«ãããã¿ã€ãã«æžã蟌ãããšãã§ããŸãã
ã¯ã©ã¹ã®éçãã£ãŒã«ãã®ç¶æ¿ã¯ã芪ã¯ã©ã¹ããã®åç §ïŒãŸãã¯å€ïŒãšãäœæãããã³ã³ã¹ãã©ã¯ã¿ãŒãžã®extendé¢æ°ãžã®2çªç®ã®åŒæ°ãšããŠæž¡ãããéçãã£ãŒã«ããæã€ãªããžã§ã¯ããåã«ã³ããŒããããšã§å®çŸãããŸãã
_.extend(child, parent, staticProps);
ã³ã³ã¹ãã©ã¯ã¿ãŒåç §ã¯ãªãã·ã§ã³ã§ãããã³ã³ã¹ãã©ã¯ã¿ãŒã¡ãœããã®åœ¢åŒã§ã¯ã©ã¹å®£èšå ã§è¡ãããŸãã ããã䜿çšãããšãã¯ãïŒä»ã®èšèªã®ããã«ïŒå¿ ã芪ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãå¿ èŠãããããã代ããã«ãéçºè ã¯å€ãã®å Žåã芪ã³ã³ã¹ãã©ã¯ã¿ãŒå ããèªåçã«åŒã³åºããã
initialize
ã¡ãœããã䜿çšã
initialize
ã
ããŒã¯ãŒãã__super__ãã¯åãªã䟿å©ãªè¿œå ã§ãã 芪ã¡ãœãããžã®åŒã³åºãã¯ãç¹å®ã®ã¡ãœããã®ååãšãã³ã³ããã¹ã
this
転éã§åŒãç¶ãçºçããŸãã ããããªããã°ããã®ãããªèª²é¡ã¯ãç¶æ¿ã®ãã«ãã¬ãã«ãã§ãŒã³ã®å Žåã«ã«ãŒãã«ã€ãªãããŸãã éåžžãçŸåšã®ã³ã³ããã¹ãã§ååãç¥ãããŠããã¹ãŒããŒã¯ã©ã¹ã¡ãœããã¯çŽæ¥åŒã³åºãããšãã§ããããããã®ããŒã¯ãŒãã¯ä»¥äžã®ç¥èªã«ãããŸããã
Backbone.Model.prototype.toJSON.apply(this, arguments);
ã³ãŒãã®èŠ³ç¹ããèŠããšãBackboneã§ã¯ã©ã¹ãæ¡åŒµããã®ã¯ããªãç°¡åã§ãã ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒãæåã§äœæãã芪ã¯ã©ã¹ã«åå¥ã«ãã€ã³ãããå¿ èŠã¯ãããŸããã ãã®äŸ¿å©ãã«ã¯ä»£åã䌎ããŸã-ãããã°ã®é£ããã ãã©ãŠã¶ãŒãããã¬ãŒã§ã¯ããã®æ¹æ³ã§ç¶æ¿ãããã¯ã©ã¹ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã¯ã
extend
"child"é¢æ°å ã§å®£èšãããåãã³ã³ã¹ãã©ã¯ã¿ãŒåãæã¡ãŸãã ãã®æ¬ ç¹ã¯ãã¯ã©ã¹ã®ãã§ãŒã³ããããã°ãããšãã«å®éã«ééãããŸã§ãç¹å®ã®ãªããžã§ã¯ããã©ã®ã¯ã©ã¹ã§ãããã©ã®ã¯ã©ã¹ããç¶æ¿ãããŠããããç解ããããšãå°é£ã«ãªããŸã§ãéèŠã§ã¯ãªãããã«æãããå ŽåããããŸãïŒ
![ç»å](https://habrastorage.org/webt/zb/jn/xx/zbjnxxtg4kifl1kr2_bpxp7l86s.png)
ããã«äŸ¿å©ãªããšã«ããã®ãã§ãŒã³ã¯Babelããã®ç¶æ¿ã䜿çšããŠãããã°ãããŸãã
![ç»å](https://habrastorage.org/webt/yd/kh/hd/ydkhhds_t6znqw4i9vpnpltmbpu.png)
ãã1ã€ã®æ¬ ç¹ã¯ã
constructor
ããããã£ãåæå¯èœã§ããããšã§ãã for-inã«ãŒãã§ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãèµ°æ»ãããšãã«åæãããŸãã ããã¯éèŠã§ã¯ãããŸããããBabelã¯ãããåŠçããå¿ èŠãªä¿®é£Ÿåããªã¹ãããã³ã³ã¹ãã©ã¯ã¿ãŒã宣èšããŸããã
Ember JSã®ã¹ãŒããŒã¯ã©ã¹åç §
Ember JSã¯Babelã«ãã£ãŠå®è£ ããã
inherits
é¢æ°ãšç¬èªã®
extend
å®è£ ã®äž¡æ¹ã䜿çšããŸã-éåžžã«è€éã§æŽç·ŽãããŠãããmixinãªã©ããµããŒãããŸãã ãã®èšäºã«ãã®é¢æ°ã®ã³ãŒããå ¥ããã ãã®ååãªã¹ããŒã¹ããªãããããã¬ãŒã ã¯ãŒã¯å€ã§ç¬èªã®ããŒãºã«äœ¿çšããå Žåããã®ããã©ãŒãã³ã¹ã«ãã§ã«çåãæããããŠããŸãã
ç¹ã«èå³æ·±ãã®ã¯ãEmberã®ãã¹ãŒããŒãããŒã¯ãŒãã®å®è£ ã§ãã ããã«ãããç¹å®ã®ã¡ãœããåãæå®ããã«èŠªã¡ãœãããåŒã³åºãããšãã§ããŸãã次ã«äŸã瀺ããŸãã
var MyClass = MySuperClass.extend({ myMethod: function (x) { this._super(x); } });
泚ïŒã¹ãŒããŒã¯ã©ã¹ã¡ãœããïŒ
this._super(x)
ïŒãåŒã³åºããšããã¡ãœããã®ååã¯æå®ããŸããã ãŸããã³ã³ãã€ã«äžã«ã³ãŒãå€æã¯çºçããŸããã
ã©ã®ããã«æ©èœããŸããïŒ Emberã¯ãã³ãŒãå€æãªãã§ãžã§ããªãã¯
_super
ããããã£ã«ã¢ã¯ã»ã¹ãããšãã«åŒã³åºãã¡ãœãããã©ã®ããã«
_super
ã§ããïŒ ããã¯ãã¹ãŠãã¯ã©ã¹ãšããªãããŒãªé¢æ°
_wrap
ã®è€éãªäœæ¥ã«é¢ãããã®
_wrap
ããã®ã³ãŒãã以äžã«ç€ºããŸãã
function _wrap(func, superFunc) { function superWrapper() { var orig = this._super; this._super = superFunc; // <--- var ret = func.apply(this, arguments); this._super = orig; return ret; } // return superWrapper; }
ã¯ã©ã¹ãç¶æ¿ããããšãEmberã¯ãã¹ãŠã®ã¡ãœãããééããããããã«å¯ŸããŠç¹å®ã®ã©ãããŒé¢æ°ãåŒã³åºããå ã®åé¢æ°ã
superWrapper
ãŸãã
ã³ã¡ã³ããä»ããŠããè¡ã«æ³šæããŠãã ããã
_super
ããããã£ã«ã¯ãåŒã³åºãããã¡ãœããã®ååã«å¯Ÿå¿ãã芪ã¡ãœãããžã®ãã€ã³ã¿ãŒãæžã蟌ãŸããŸãïŒ
extend
åŒã³åºããããšãã«ã¯ã©ã¹ãäœæãã段éã§ã察å¿ãå€æããäœæ¥ãçºçããŸããïŒã 次ã«ãå ã®é¢æ°ãåŒã³åºããããããã芪ã¡ãœãããšããŠ
_super
ã¢ã¯ã»ã¹ã§ããŸãã 次ã«ã
_super
ããããã£ã«å ã®å€
_super
å²ãåœãŠããããããæ·±ãåŒã³åºããã§ãŒã³ã§äœ¿çšã§ããŸãã
ãã®ã¢ã€ãã¢ã¯ééããªãèå³æ·±ããã®ã§ãããç¶æ¿ã®å®è£ ã«é©çšã§ããŸãã ããããããããã¹ãŠãããã©ãŒãã³ã¹ã«æªåœ±é¿ãäžããããšã«æ³šæããããšãéèŠã§ãã åã¯ã©ã¹ã¡ãœããïŒèŠªã¡ãœããããªãŒããŒã©ã€ãããå°ãªããšã1ã€ïŒã¯ã
_super
ããããã£ã䜿çšãããšããäºå®ã«é¢ä¿ãªããåå¥ã®é¢æ°ã«å€ãããŸãã ãããã£ãŠã1ã€ã®ã¯ã©ã¹ã®ã¡ãœããåŒã³åºãã®æ·±ããã§ãŒã³ã«ãããã¹ã¿ãã¯ã倧ãããªããŸãã ããã¯ãã«ãŒãå ã§å®æçã«åŒã³åºãããã¡ãœãããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãã¬ã³ããªã³ã°ãããšãã«ç¹ã«éèŠã§ãã ãããã£ãŠããã®å®è£ ã¯é¢åã§ãããèšé²ã®ç瞮圢ãšãã圢ã§åŸãããå©ç¹ãæ£åœåã§ããªããšèšããŸãã
æãäžè¬çãªééã
å®éã«æãäžè¬çã§å±éºãªééãã®1ã€ã¯ã芪ã¯ã©ã¹ãå±éããããšãã«ã€ã³ã¹ã¿ã³ã¹ãäœæããããšã§ãã ãã®ãããªã³ãŒãã®äŸã次ã«ç€ºããŸãããã®ã³ãŒãã®äœ¿çšã¯åžžã«é¿ããå¿ èŠããããŸãã
function BaseClass() { this.x = this.initializeX(); this.runSomeBulkyCode(); } // ... BasicClass ... function SubClass() { BaseClass.apply(this, arguments); this.y = this.initializeY(); } // SubClass.prototype = new BaseClass(); SubClass.prototype.constructor = SubClass; // ... SubClass ... new SubClass(); //
ééãã«æ°ã¥ããŸãããïŒ
ãã®ã³ãŒãã¯æ©èœãã ãµãã¯ã©ã¹ã芪ã¯ã©ã¹ã®ããããã£ãšã¡ãœãããç¶æ¿ã§ããããã«ããŸã ã ãã ãã
prototype
ãä»ããã¯ã©ã¹ãã€ã³ãã£ã³ã°äžã«ã芪ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããããã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãããŸããããã«ãããç¹ã«ã³ã³ã¹ãã©ã¯ã¿ãŒããªããžã§ã¯ãïŒ runSomeBulkyCode ïŒã®äœææã«å€ãã®äœæ¥ãè¡ãå ŽåãäžèŠãªã¢ã¯ã·ã§ã³ãçºçããŸãã ããã¯ã§ããŸããã
SubClass.prototype = new BaseClass();
ããã«ããã芪ã³ã³ã¹ãã©ã¯ã¿ãŒïŒ
this.x
ïŒã§åæåãããããããã£ãæ°ããã€ã³ã¹ã¿ã³ã¹ã§ã¯ãªãã SubClassã¯ã©ã¹ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã®ãããã¿ã€ãã«æžã蟌ãŸãããšãé倧ãªæ€åºå¯èœãšã©ãŒãçºçããå¯èœæ§ããããŸãã ããã«ãåãBaseClassã³ã³ã¹ãã©ã¯ã¿ãŒããµãã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒããç¹°ãè¿ãåŒã³åºãããŸãã åŒã³åºãæã«èŠªã³ã³ã¹ãã©ã¯ã¿ãããã€ãã®ãã©ã¡ãŒã¿ãå¿ èŠãšããå Žåããã®ãããªãšã©ãŒãäœæããããšã¯å°é£ã§ãããããããååšããªãå Žåãããã¯éåžžã«å¯èœã§ãã
代ããã«ããããã¿ã€ãã芪ã¯ã©ã¹ã®ãããã¿ã€ãããããã£ã§ãã空ã®ãªããžã§ã¯ããäœæããŸãã
SubClass.prototype = Object.create(BasicClass.prototype);
ãŸãšã
Babelã³ã³ãã€ã©ïŒES6-to-ES5ïŒããã³Backbone JSãEmber JSã®ãã¬ãŒã ã¯ãŒã¯ã§ã®ç䌌å€å žçç¶æ¿ã®å®è£ äŸã玹ä»ããŸããã 以äžã¯ãåè¿°ã®åºæºã«ãã3ã€ã®å®è£ ãã¹ãŠã®æ¯èŒè¡šã§ãã
ããã« | ããã¯ããŒã³js | ãšã³ããŒjs | |
---|---|---|---|
èšæ¶ | åæ§ã« | ||
æ§èœ | ããé«ã | å¹³å | äž |
éçãã£ãŒã«ã | + ïŒES6ã®ã¿ïŒ* | + | - ïŒããã«ããã®ç¶æ¿ã®å éšäœ¿çšãé€ãïŒ |
ã¹ãŒããŒã¯ã©ã¹ãªã³ã¯ | super.methodName()
ïŒES6ã®ã¿ïŒ | Constructor.__super__.prototype
| this._super()
|
å粧åã®è©³çŽ° | ES6ã«æé©ã§ãã
ES5ã§ã®ç¬èªã®å®è£ ã«æ¹è¯ãå¿ èŠ | çºè¡šã®äŸ¿å©ãã ãããã°ã®åé¡ | ç¶æ¿ã®æ¹æ³ã«äŸåããŸãã ããã¯ããŒã³ãšåããããã°åé¡ |
ããã©ãŒãã³ã¹åºæºã¯ã絶察å€ã§ã¯ãªããåããªã¢ã³ãã®æäœãšãµã€ã¯ã«ã®æ°ã«åºã¥ããŠãä»ã®å®è£ ãšæ¯èŒããŠè©äŸ¡ãããŸããã äžè¬ã«ãããã©ãŒãã³ã¹ã®éãã¯ããã»ã©éèŠã§ã¯ãããŸããã ã¯ã©ã¹ã®æ¡åŒµã¯éåžžãã¢ããªã±ãŒã·ã§ã³ã®åæ段éã§1åçºçããå床åŒã³åºãããããšã¯ãããŸããã
äžèšã®äŸã«ã¯ãã¹ãŠé·æãšçæããããŸãããããã«ã®å®è£ ãæãå®çšçã§ãããšèããããšãã§ããŸãã äžèšã®ããã«ãå¯èœã§ããã°ãES5ã§ã®ã³ã³ãã€ã«ã§EcmaScript 6ã§æå®ãããç¶æ¿ã䜿çšããŸãã ãããäžå¯èœãªå Žåãäžèšã®ã³ã¡ã³ããšä»ã®äŸããã®è¿œå ãèæ ®ããŠãBabelã³ã³ãã€ã©ãŒã®äŸã«åºã¥ããŠã
extend
é¢æ°ã®å®è£ ãèšè¿°ããããšããå§ãããŸãã ãã®ãããç¹å®ã®ãããžã§ã¯ãã«æãæè»ã§é©åãªæ¹æ³ã§ç¶æ¿ãå®è£ ã§ããŸãã
ãœãŒã¹
- JavaScript.ruïŒç¶æ¿
- ããããã»ã·ã£ãªãã JavaScriptç¶æ¿ãã¿ãŒã³
- ãšãªãã¯ã»ãšãªãªãã 3çš®é¡ã®ãããã¿ã€ãç¶æ¿ïŒES6 +ãšãã£ã·ã§ã³
- ãŠã£ãããã£ã¢ïŒç¶æ¿ãããæ§æ
- Mozillaéçºè ãããã¯ãŒã¯ïŒObject.prototype
- ããã¯ããŒã³js
- ãšã³ããŒjs
- ããã«