рдХреНрдпрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рднрд╛рдЧ реи

рднрд╛рдЧ 1 рджреЗрдЦреЗрдВ

рдкреНрд░рджрд░реНрд╢рди: __proto__ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдирд╛


рдЫрд╡рд┐
рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, Object.create рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдмрдбрд╝реЗ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде - рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛)ред рд╕реАрдзреЗ __proto__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ рдирдП рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднреА рддреЗрдЬрд╝ рдирд┐рдХрд▓рд╛ - jsPerf рджреЗрдЦреЗрдВред рдореИрдВ рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд┐рд╡рд░рдгрджрд╛рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред

рдХреНрд▓реЛрдирдЬ рдиреИрдиреЛ


рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдХреНрд▓реЛрди рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдБ:
function clone(proto, properties){ properties.__proto__ = proto; return properties; } 

рдХреНрд▓реЛрдирд┐рдВрдЧ

рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк-рдУрд░рд┐рдПрдВрдЯреЗрдб рд╕рд┐рд╕реНрдЯрдо рдПрдХ рдирдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ: рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреНрд▓реЛрди рдХрд░рдирд╛, рдпрд╛ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ред рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреНрд░реЙрдкрд░реНрдЯреАрдЬрд╝ рдФрд░ рдореЗрдердбреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдереИрдЯрд┐рдХ рдЯреВрд▓реНрд╕ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╡рд╕реНрддреБ рд╕реЗ рдПрдХ рдкреВрд░реНрдг рдкреНрд░рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ - рдПрдХ рдХреНрд▓реЛрдиред рдХреНрд▓реЛрдирд┐рдВрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдПрдХ рдкреНрд░рддрд┐ рдЗрд╕рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕реА рдХреНрд╖рдг рд╕реЗ, рдпрд╣ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
┬й рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛

clone() рдлрд╝рдВрдХреНрд╢рди, рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдХреНрд▓реЛрди рдмрдирд╛рддрд╛ рд╣реИред рдПрдХ рдХреНрд▓реЛрди рдПрдХ рдЖрд▓рд╕реА рдЙрдерд▓реА рдкреНрд░рддрд┐ рд╣реИ , рдЕрд░реНрдерд╛рдд, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдХрд┐рд╕реА рднреА рдЧреБрдг рдХреЛ рдЬреЛрдбрд╝рддреЗ / рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдореВрд▓ рд╡рд╕реНрддреБ (рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк) рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯ Object.prototyp (рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ. Object.create(null) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдИ рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдХреЗ рдХреНрд▓реЛрди рд╣реИрдВред

 /// "" var duck$ = { name: "Unnamed", quack: function(){ console.log( this.name +" Duck: Quack-quack!"); } }; ///  var talkingDuck$ = clone( duck$, { quack: function(){ duck$.quack.call(this); console.log("My name is "+ this.name +"!"); } }); ///  var donald = clone( talkingDuck$, {name: "Donald"}); 

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 /// object$ тАУ     var object$ = { clone: function(properties){ properties.__proto__ = this; return properties; }; /// "" var duck$ = object$.clone({ name: "Unnamed", quack: function(){ console.log( this.name +" Duck: Quack-quack!"); } }; ///  var talkingDuck$ = duck$.clone({ quack: function(){ duck$.quack.call(this); console.log("My name is "+ this.name +"!"); } }); ///  var donald = talkingDuck$.clone({name: "Donald"}); 

рдЕрдиреБрдХреВрд▓рддрд╛


__proto__ ECMA рд╕реНрдХреНрд░рд┐рдкреНрдЯ 6 рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬреЛ рджрд┐рд╕рдВрдмрд░ 2013 рдореЗрдВ рдЕрдиреБрдореЛрджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реИ ред

рдпрд╣ рдХрд╣рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рдХреНрд▓реЛрди рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 function clone(proto, properties){ var newObj = {__proto__: proto}; for(var key in properties) newObj[key] = properties[key]; return newObj; } 

рд▓реЗрдХрд┐рди рддрдм рд╣рдо рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рдЦреЛ рдЬрд╛рдПрдВрдЧреЗред рдирд┐рдпрдо рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:
рдХреНрд▓реЛрдирд┐рдВрдЧ рдХреЗ рдмрд╛рдж рджреВрд╕рд░реЗ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
рдпрд╣ рдирд┐рдпрдо Internet Explorer 6тАУ10 рдФрд░ ECMA рд╕реНрдХреНрд░рд┐рдкреНрдЯ 3 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:
  function clone(/** Object */proto, /** ObjLiteral= */ownProperties){ function Clone(ownProperties){ for(var key in ownProperties) this[key] = ownProperties[key]; }; Clone.prototype = proto; return new Clone(ownProperties); } 



рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреНрд▓реЛрди.рдЬреЗрдПрд╕ рдврд╛рдВрдЪреЗ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ред

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


All Articles