use Object.create() to create new object as prototype
set Child.prototype to inherit (extends)
reset Child.prototype.constructor to keep correct constructor
use Parent() WITHOUT new as super()
Object.getPrototypeOf() to properly find prototype
Proper inheritance
functionBase(name, group){this.name = name;this.group = group;}// To define public inheritable functionBase.prototype.getPath=function (){returnthis.group +'.'+this.name;}functionFuture(init, opt, extra){this.resolved =undefined;// To keep `this` in `done()` functionconstself=this;functiondone(v){self.resolved = v; }if(opt){// To pass the correct 'this' to `super()`Base.call(self,opt.name,opt.group); }init(done,...extra);}// To inherit properly with correct constructorFuture.prototype=Object.create(Base.prototype);Future.prototype.constructor= Future;// To define public inheritable functionFuture.prototype.then=function(cb){this.resolved =cb(this.resolved) ||this.resolved;}functionRejectableFuture(init, opt){this.rejected =undefined;// To keep `this` in `done()` functionconstself=this;functionwrong(v){self.rejected = v; }// To pass the correct 'this' to `super()`Future.call(self, init, opt, [wrong]);}// To inherit properly with correct constructorRejectableFuture.prototype=Object.create(Future.prototype);RejectableFuture.prototype.constructor= RejectableFuture;// To define public inheritable functionRejectableFuture.prototype.catch=function(cb){try{this.resolved =cb(this.rejected) ||this.resolved; }catch(rejected){this.rejected = rejected; }}// To overwrite parent functionRejectableFuture.prototype.then=function(cb){try{this.resolved =cb(this.resolved) ||this.resolved; }catch(rejected){this.rejected = rejected; }}rft =newRejectableFuture( (done, wrong) => {console.log('done n wrong');done(1);wrong(2) }, { name:'doneNwrong', group:'ulti' });rft.then(console.log);// 1rft.catch(console.log)// 2rft.then(r => { console.log(r); return`return(${r})`; });// 1rft.then(console.log);// return(1)rft.catch(r => { console.log(r); throw`throw(${r})`; });// 2rft.catch(console.log);// throw(2)rft.getPath();// ulti.doneNwrong
The protorype chain
RejectableFuture.prototype===Object.getPrototypeOf(rft);// Future {constructor: RejectableFuture, catch, then }Future.prototype!==Object.getPrototypeOf(Object.getPrototypeOf(rft));// Base {constructor: Future, then}Future.prototype!==Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(rft)));// { constructot: Base, getPath }
Use Prototype public function in constructor
This is similar to react component constructor handler binding
functionFuture(init, opt, extra){this.resolved =undefined;if(opt){Base.call(this,opt.name,opt.group); }// To use the public function, while bind is requiredinit(this.done.bind(this),...extra);}Future.prototype=Object.create(Base.prototype);Future.prototype.constructor= Future;Future.prototype.then=function(cb){this.resolved =cb(this.resolved) ||this.resolved;}Future.prototype.done=functiondone(v){this.resolved = v;}