рджреБрдорд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдБ

рдЬреЗрдПрд╕ рдореЗрдВ рд╢рд╛рд╕реНрддреНрд░реАрдп (рд╢рдмреНрдж рд╡рд░реНрдЧ рд╕реЗ) рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд▓рдЧрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдХреЛрдб - рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрд░реАрдХреЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдмрд▓реНрдХрд┐ рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╛рдо рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ рд╡рд┐рдзрд┐ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред


1. рдЕрд╢реБрджреНрдзрддрд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпрд╛ рд╣реИрдВ?


рдПрдХ рдорд┐рд╢реНрд░рдг (рдорд┐рдХреНрд╕рдЪрд░) рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╣реИ, рдЬреЛ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд╡рдпрдВ (рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдЕрд▓рдЧ) рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрджреНрднреБрдд рдкреНрд░рд╡реЗрд╢ рд╣реИ:

var Mixin_Babbler = { say: function () { console.log("My name is " + this.name + " and i think:'" + this.THOUGHTS + "'"); }, argue: function() { console.log("You're totally wrong"); } }; 

рдЬрдм рдЙрдХреНрдд рд╡рд┐рдзрд┐ рдХреЛ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рддреЛ рдПрдХ bummer рд╣рдорд╛рд░реА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рди рддреЛ рдпрд╣.рдирд╣реАрдВ рдФрд░ рди рд╣реА рдпрд╣ ред рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ, рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реИ, рдЕрдкрдиреЗ рдЗрдЪреНрдЫрд┐рдд рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЕрд╢реБрджреНрдзрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдЗрд╕реЗ рдЕрд╢реБрджреНрдзрддрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░рддреА рд╣реИ рдЬреЛ рдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛрддреА рд╣реИ - рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░, рдпрд╛ рдорд┐рд╢реНрд░рдг, рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:

 function extend(object) { var mixins = Array.prototype.slice.call(arguments, 1); for (var i = 0; i < mixins.length; ++i) { for (var prop in mixins[i]) { if (typeof object.prototype[prop] === "undefined") { object.prototype[prop] = mixins[i][prop]; } } } } 

2. рдЦреИрд░, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?


рдЖрд╕рд╛рди рдФрд░ рдмрд┐рдирд╛ рддрдирд╛рд╡ рдХреЗ - рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдБ рд╣реИрдВ:

 var Mixin_Babbler = { say: function () { console.log("My name is " + this.name + " and i think:'" + this.THOUGHTS + "'"); }, argue: function() { console.log("You're totally wrong"); } }; var Mixin_BeverageLover = { drink: function () { console.log("* drinking " + this.FAVORITE_BEVERAGE + " *"); } }; 

рдФрд░, рдХрд┐рд╕реА рдХреЛ, рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдЪрд┐рдд, рд╡рд┐рдХрд╛рд╕рд╡рд╛рджреА рд╢реНрд░реГрдВрдЦрд▓рд╛:

 function Man(name) { this.name = name; } Man.prototype = { constructor: Man, THOUGHTS: "I like soccer" } extend(Man, Mixin_Babbler); function Gentleman(name) { this.name = name; } Gentleman.prototype = { constructor: Gentleman, THOUGHTS: "I like Earl Grey", FAVORITE_BEVERAGE: "Tea" } extend(Gentleman, Mixin_Babbler, Mixin_BeverageLover); function Programmer(name) { this.name = name; } Programmer.prototype = { constructor: Programmer, THOUGHTS: "MVC, MVVM, MVP *___* like it!", FAVORITE_BEVERAGE: "Cofee", write_good_code: function () { console.log("*writing best code ever*"); this.drink(); } } extend(Programmer, Mixin_Babbler, Mixin_BeverageLover); 

рдкреНрд░рддреНрдпреЗрдХ "рд╡рд░реНрдЧ" рдЕрдм рджреВрд╕рд░реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рдФрд░ рд╕рднреА рджреЛрд╣рд░рд╛рдИ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред

рдЕрдм рдпрд╣ рд╕рдм рдХреБрдЫ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ - рдпрд╣ рдЕрдЪрд╛рдирдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛:

 var man = new Man("Bob"); var gentleman = new Gentleman("Bill"); var programmer = new Programmer("Benjamin"); man.say(); man.argue(); gentleman.say(); gentleman.drink(); programmer.say(); programmer.write_good_code(); 

рдФрд░ рдХрдВрд╕реЛрд▓ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╣рд╛рдБ, рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

 My name is Bob and i think:'I like soccer' *You're totally wrong* My name is Bill and i think:'I like Earl Grey' *drinking Tea* My name is Benjamin and i think:'MVC, MVVM, MVP like *__* it!' *writing best code ever* *drinking Cofee* 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдм рдХреБрдЫред "рд╢рд╛рд╕реНрддреНрд░реАрдп" рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рд╣реИред рдмреЗрд╢рдХ, рдХреБрдЫ рд╡рд┐рд╡рд┐рдзрддрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп, рдХрд░реНрдиреЗрд▓ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рджрд┐рдЦрддрд╛ рд╣реИред

рдпреБрдкреАрдбреАред рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрдирд╛рдо рд▓рд▓рд╛рдХреА рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╡реНрдпрдХреНрддрд┐ рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ , рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 function extend_2(object) { var mixins = Array.prototype.slice.call(arguments, 1); for (var i = 0; i < mixins.length; ++i) { for (var prop in mixins[i]) { if (typeof object.prototype[prop] === "undefined") { bindMethod = function (mixin, prop) { return function () { mixin[prop].apply(this, arguments) } } object.prototype[prop] = bindMethod(mixins[i], prop); } } } } 


рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЖрдк рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдордХреНрдЦреА рдкрд░ рддрд░реАрдХреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпреЗ рдкрд░рд┐рд╡рд░реНрддрди рддреБрд░рдВрдд рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЗрд╕ рдкреНрд░рд╡реЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗред
рдПрдХ рдмрд╣реБрдд, рдмрд╣реБрдд рдЫреЛрдЯреА рдЦрд╛рдореА рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдорд╛рд╣реМрд▓ рдореЗрдВ рдПрдХ рдирд╣реАрдВ-рд╕реНрдорд╛рд░реНрдЯ рд╕рдВрдХреЗрдд рд╣рдореЗрд╢рд╛ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИред

рд╕рднреА рдХреЛрдб рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╢рд╛рдВрддрд┐ рд╕реЗ рдпрд╣реАрдВ рд╣реИрдВред

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


All Articles