рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ OOP

рдореИрдВ рдЖрдкрдХреЛ createClass рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдХреНрдпрд╛ рдЗрд╕ рдирд┐рд░реНрдорд╛рддрд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ:
1. рдХреЛрдб рд╕реНрд╡рдпрдВ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд▓рдЧрддрд╛ рд╣реИ
2. рдХрдИ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди
3. рдЕрдореВрд░реНрдд рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди
4. рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рд╡рд░реНрдЧреАрдп рдЧреБрдгреЛрдВ рдХрд╛ рдЕрдиреБрд░рдХреНрд╖рдг
5. рдЪрддреБрд░ рдЙрджрд╛рд╣рд░рдг (рд╡рд┐рдзрд┐) рд╡рд░реНрдЧреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ

рддреЛ, рддреБрд░рдВрдд рдПрдХ рдЙрджрд╛рд╣рд░рдг:
var Animal = createClass({ abstracts: ['say'], construct: function(name) { this.name = name; }, eat: function() { return 'ou yeah...'; } }); var Kitty = createClass({ extend: Animal, say: function() { return this.name + ' said: RrrrRRR...Mau..'; }, eat: function() { return Animal.fn.eat.call(this) + 'FISH!!' } }); var Doggy = createClass({ extend: Animal, construct: function(name) { Animal.call(this, name); console.log('doggy have been created'); }, say: function() { return this.name + ' said: GAV!'; }, eat: function() { return Animal.fn.eat.call(this) + 'MEAT!!' } }); var sharik = new Doggy('sharik'); // doggy have been created var murka = new Kitty('murka'); console.log( sharik.eat(), sharik.say()); // ou yeah...MEAT!! sharik said: GAV! console.log( murka.eat(), murka.say()); // ou yeah...FISH!! murka said: RrrrRRR...Mau.. 

рд╕рднреА рд╡рд░реНрдЧ рдЧреБрдгреЛрдВ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕реНрдерд┐рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕реНрдерд┐рд░ рдЧреБрдг, рдЬреЛ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА)ред
рдкрд╢реБ рд╡рд░реНрдЧ рдореЗрдВ рдЙрдХреНрдд рдкрджреНрдзрддрд┐ рдХрд╛ рдЕрдореВрд░реНрддрди рд╣реИред рдХрд┐рдЯреНрдЯреА рдФрд░ рдбреЙрдЧреА рдХрдХреНрд╖рд╛рдПрдВ рдкрд╢реБ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддреА рд╣реИрдВ рдФрд░ рдХрд╣рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдЪреВрдВрдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХрд┐рдЯреНрдЯреА рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкрд╢реБ рд╕реЗ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдбреЙрдЧреА рдореЗрдВ, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреЗрд░реЗрдВрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдПрдирд┐рдорд▓.рдХреЙрд▓ (рдпрд╣, рдирд╛рдо) рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореВрд▓ рд╡рд░реНрдЧ рдХреА рдЦрд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ Animal.fn.eat.call рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣) Animal.prototyp.eat.call (рдпрд╣) рдХреЗ рд╕рдорд╛рди рд╣реИ

рдЕрдЧрд▓реЗ:
 var Singleton = createClass({ statics: { construct: function() { this._instance = null; }, getInstance: function() { if(this._instance === null) { this._instance = new this(); } return this._instance; } } }); var SuperDoggy = createClass({ extend: [Animal, Singleton], say: function() { return this.name + ' said: GAV! GAV! GAV!'; } }); var dog1 = SuperDoggy.getInstance(), dog2 = SuperDoggy.getInstance(); dog1.name = 'Bob'; console.log(dog1 === dog2); // true console.log(dog1.eat(), dog1.say()); // ou yeah... Bob said: GAV! GAV! GAV! 

рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдерд┐рд░ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдФрд░ рдПрдХ рд╕реНрдерд┐рд░ getInstance рдкрджреНрдзрддрд┐ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд┐рдВрдЧрд▓рдЯрди рдкреИрдЯрд░реНрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред SuperDoggy рдХреЛ рджреЛ рдкрд╢реБ рд╡рд░реНрдЧреЛрдВ, рд╕рд┐рдВрдЧрд▓рдЯрди рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдФрд░ рдЙрдХреНрдд рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рд╕реНрдЯреИрдЯрд┐рдХреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдХрдХреНрд╖рд╛ рдмрдирд╛рддреЗ рд╕рдордп рдФрд░ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд╕реНрдерд┐рд░ рдЧреБрдгреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рд╕ рдХреЛ рд╣реА рдмрдирд╛рддрд╛ рд╣реИ?

рд╡рд┐рдзрд┐ рдХреЗ рдЙрджрд╛рд╣рд░рдг "рдЙрджрд╛рд╣рд░рдг":
 console.log( dog2.instanceOf(Kitty) === false ); // true console.log( dog2.instanceOf(SuperDoggy) === true ); // true console.log( dog2.instanceOf(Animal) === true ); // true console.log( sharik.instanceOf(Animal, Singleton) === false ); // true console.log( dog2.instanceOf(Animal, Singleton) === true ); // true 

рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдореВрд▓ рд░реВрдк рд╕реЗ рдбреЗрд╡рд┐рдб рдлреНрд▓реЗрдВрдЧрди рдХреА рдкреБрд╕реНрддрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ 5 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдкреБрд╕реНрддрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг ред рдирддреАрдЬрддрди, рдпрд╣ рдХреЛрдб рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдПрдХ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдЖред

рдЪреВрдВрдХрд┐ рд╕реНрд░реЛрдд рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдпрд╣реАрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ:
 function createClass(data) { var abstracts = data.abstracts || [], statics = data.statics || {}, extend = data.extend || []; if(!(extend instanceof Array)) extend = [extend]; // define constructor var constructor; if(data.construct) { constructor = data.construct; } else if(extend.length) { constructor = function() { for(var i=0; i<extend.length; i++) { extend[i].apply(this, arguments); } } } else { constructor = function() {}; } // prototype for our class. var proto = {}; delete data.construct; delete data.abstracts; delete data.statics; delete data.extend; // borrow methods from parent classes for(var i=0; i<extend.length; i++) { var parent = extend[i]; // static constructor if( typeof parent.construct == "function") parent.construct.call(constructor); // copy static methods for(var p in parent) { if (typeof parent[p] != "function" || p == "construct") // copy only functions continue; constructor[p] = parent[p]; } // Copy prototype methods for(var p in parent.prototype) { if (typeof parent.prototype[p] != "function" || p == "constructor") continue; proto[p] = parent.prototype[p]; } } // build abstract static methods if(statics.abstracts) { for(var p=0; p<statics.abstracts.length; p++) { proto[ statics.abstracts[p] ] = function() { throw p + ' is static abstract method' }; } } // build abstract prototype methods for(var p=0; p<abstracts.length; p++) { proto[ abstracts[p] ] = function() { throw p + ' is abstract method' }; } // internal methods proto.instanceOf = function(_class) { if(arguments.length > 1) { var res = true; for(var i=0; i<arguments.length; i++) res = res && this.instanceOf(arguments[i]); return res; } if(constructor === _class) return true; for(var i=0; i<extend.length; i++) { if( extend[i].prototype.instanceOf.call(this, _class) ) return true; } return _class === Object; }; // rest of data are prototype methods for(var p in data) { if (typeof data[p] != "function") // copy only functions continue; proto[p] = data[p]; } // static functions of class for(var p in statics) { if (typeof statics[p] != "function") // copy only functions continue; constructor[p] = statics[p]; } // static constructor if( typeof statics.construct == "function") statics.construct.call(constructor); // proto.constructor = constructor; constructor.prototype = proto; constructor.fn = proto; // short case // Finally, return the constructor function return constructor; } 

Source: https://habr.com/ru/post/In132698/


All Articles