CoffeeScript рдореЗрдВ рдмреЗрд╣рддрд░ рд╡рд┐рд░рд╛рд╕рдд

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

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

рдХреЙрдлреА рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
рд╢реНрд░реЗрдгреА рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

 for key of parent child[key] = parent[key] if __hasProp_.call(parent, key) 

рдпрд╣реА рд╣реИ, рд╕рднреА рдЧреБрдгреЛрдВ рдХреЛ рдмрд╕ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде, рд▓рдЪреАрд▓рд╛рдкрди рдЦреЛ рдЬрд╛рддрд╛ рд╣реИред

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

рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╢реНрд░реЗрдгреА рдХреЗ рдЧреБрдг рднреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкред рдХреЙрдлреА рдХреА рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рд╕рдм рдХреБрдЫ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ :) рдФрд░ child.__proto__ = parent рд╕реЗрдЯ рдХрд┐рдпрд╛ child.__proto__ = parent ред

рдЗрд╕ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд╕рд╛рде, рдмрдЪреНрдЪреЗ рдХреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдкреВрд░реНрд╡рдЬ рдХреЗ рд╕рднреА рдЧреБрдгреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреА,
рдЬрд┐рд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрд╡рд╕рд░ рд╣реИ
рдЗрд╕ рддрдереНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд┐ рдЧреБрдг рд╣реИрдВ
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк, рд╡рд╕реНрддреБ рд╣реА рдирд╣реАрдВред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╢реНрд░реЗрдгреА рдЙрджрд╛рд╣рд░рдг рдЪрд░ рд╣реИред
UPD: рд╕рднреА рд╕рдорд╛рди, рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдЪрд░ рд╡рд░реНрдЧ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдирд╣реАрдВред
рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдЪрд░ред рдХреЗрд╡рд▓ рдПрдХ рд╡рд░реНрдЧ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред

 Object.defineProperty Parent, 'test', get: -> @_test if @hasOwnProperty '_test' set: (val) -> @_test = val Parent.test = 1 Parent.test # => 1 Child.test # => undefined Child.test = 2 Parent.test # => 1 Child.test # => 2 

рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЙрдлреА_рдХреНрд▓рд╛рд╕рдХрд┐рдЯ рдкреИрдХреЗрдЬ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╣реИред
рдпрд╣ рдкреИрдХреЗрдЬ рд░реВрдмреА рд╕реЗ рд▓реА рдЧрдИ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
append_features рдХрд╛ рдЙрдкрдпреЛрдЧ append_features include , extend рдЙрдкрдпреЛрдЧ рдХрд░ extend рдХрд░реЗрдВ
рд╣реБрдХ inherited, included, extended ред рдореИрдВ рдпрд╣рд╛рдБ рдЙрдирдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛:
рд╡реЗ рд░реВрдмреА рд╕реЗ рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рдХреЗрд╡рд▓ рдХреИрдо рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╛рдоред
рдЬреЛ рднреА рд░реВрдмреА рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ, рдХрдард┐рдирд╛рдИ рдХреЗ рдмрд┐рдирд╛, рд╕рдм рдХреБрдЫ рд╕реНрд░реЛрдд рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛рдПрдЧрд╛,
рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЫрд╣ рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИрдВред

рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрд▓рдмреНрдз рд╣реИ:
 classkit = require 'coffee_classkit' class Child extends Parent classkit.extendsWithProto @ classkit.include @, Mixin 

рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд░рдЪрдирд╛ рдореЗрдВ рдпреЗ рд╕рднреА рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВред
рдЗрд╕рдореЗрдВ рд╕реЗ рдПрдХ рд╡рд░реНрдЧ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдкрд░рд┐рдЪрд┐рдд рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 class Example extends classkit.Module @extendsWithProto() @include Mixin 

рдкреИрдХреЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ ActiveSupport::Concern рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ ActiveSupport::Concern :

 class Mixin extends classkit.Module @extendsWithProto().concern() @includedBlock: -> #      @instanceVariable 'test' class @ClassMethods someClassMethod: -> someInstanceMethod: -> class Base extends classkit.Module @include Mixin @someClassMethod() (new Base).someInstanceMethod() 

рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдореЙрдбреНрдпреВрд▓рд░ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдХреЛрдб, рдЧреНрд▓реЛрдмрд▓ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рдЯреВрдЯреЗ рдмрд┐рдирд╛ред
рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ,
CoffeeClasskit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд▓рд┐рдЦрд╛ред

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


All Articles