
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ __proto__, рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЧреБрдг рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдирдП рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреНрдпрд╛ рд╣реИрдВред
__Proto__ рд╕рдВрдкрддреНрддрд┐
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреЗ рдкрд╛рд╕ __proto__ рд╕рдВрдкрддреНрддрд┐ рд╣реИред рдпрд╣ рдПрдХ рдЫрд┐рдкреА рд╣реБрдИ рдкреНрд░рдгрд╛рд▓реА рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рднрд╛рд╖рд╛ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдирд╣реАрдВред
рдЬрдм рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рдХрд┐рд╕реА рднреА рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╡рд╕реНрддреБ рдореЗрдВ рд╣реА рдЦреЛрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ:
var obj = {ownProperty: 1}; console.log(obj.ownProperty);
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЦреЛрдЬ __proto__ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рд╣реЛрддреА рд╣реИ:
obj.__proto__ = {propertyOfProto: 2}; console.log(obj.propertyOfProto);
рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдиреАрдЪреЗ рдЦреЛрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ:
obj.__proto__.__proto__ = {propertyOfProtosProto: 3}; console.log(obj.propertyOfProtosProto);
рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЗ __proto__ (рд╢реВрдиреНрдп рдФрд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдЗрд╕реА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ:
(0).__proto__ === Number.prototype && false.__proto__ === Boolean.prototype && "string".__proto__ === String.prototype && (new Date).__proto__ === Date.prototype && (function(){}).__proto__ === Function.prototype
рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣реИ:
Number.prototype.__proto__ === Object.prototype
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЕрдВрдд:
Object.prototype.__proto__ === null
рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕рдВрдкрддреНрддрд┐
рд▓реЗрдХрд┐рди рдлрд┐рд░ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╕рдВрдкрддреНрддрд┐ рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рджреЛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░:
1) рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдлрдВрдХреНрд╢рдВрд╕ рдХреЗ рдкрд╛рд╕ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреНрд░реЙрдкрд░реНрдЯреА рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдПрдХрд▓ рдирд┐рд░реНрдорд╛рддрд╛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рд╣реИ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред

2) рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирдП рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдирдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирдпрд╛ рд╕рдВрдЪрд╛рд▓рдХ
рдпрд╣ рдХрдерди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:
1) рдПрдХ рдЦрд╛рд▓реА рд╡рд╕реНрддреБ рдмрдирд╛рддрд╛ рд╣реИ:
var instance = {};
2) рдПрдХ рд╡рд░реНрдЧ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕ рд╡рд╕реНрддреБ рдХреЛ __proto__ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:
instance.__proto__ = FnClass.prototype;
3) рд╣рдорд╛рд░реЗ рдирдП рдмрдирд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
constructorReturns = FnClass.apply(instance, arguments);
(рдпрд╛рдиреА, рдпрд╣ FnClass рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рддрд░реНрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ)
4) рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ FnClass рдиреЗ рд╣рдореЗрдВ рдХреЛрдИ рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рджреА, рддреЛ рдпрд╣:
return constructorReturns instanceof Object ? constructorReturns : instance;
рдореИрдВ рдПрдХ рдХреНрд▓рд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдирдП рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИред рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдкреВрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ __proto__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ __proto__ рд╕рдВрдкрддреНрддрд┐ рдЫрд┐рдкреА рд╣реБрдИ рд╣реИ, рдФрд░ рднрд╛рд╖рд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╕реНрдкрд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдЧрд▓рдд рд╣реИред рдЗрд╕рд▓рд┐рдП рдХрднреА рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╣реВрдВ :) рдпрд╣ рдХреЛрдб рдХреЗрд╡рд▓ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд╡реАрдирддрдо (рд╡рд░реНрддрдорд╛рди) ECMA рд╕реНрдХреНрд░рд┐рдкреНрдЯ 5 рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреА рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ __proto__ рд╕рдВрдкрддреНрддрд┐, Object.create рдФрд░ Object.getPrototypOf рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред
рдореИрдВ рдЙрдирдХреЗ рдХрд╛рдо рдХреЛ рджреЛ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛:
рдпрджрд┐ рдЖрдк рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реНрд╡рдпрдВ Object.create рд╡рд┐рдзрд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
if(!Object.create){ Object.create = function(proto){ var Fn = function(){}; Fn.prototype = proto; return new Fn; } }
GetPrototypOf рдХреЗ рд╕рд╛рде, рд╕реНрдерд┐рддрд┐ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдЗрд╕реЗ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рддрднреА рдЬрдм рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реЛ:
if(!Object.getPrototypeOf){ if( (new Object).__proto__ !== Object.prototype ){
рдФрд░ рдмреЗрд╣рддрд░ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд▓рд╛рд╣ рджреА рдЧрдИ рд╣реИ,
github.com/kriskowal/es5-shim рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ