рдореИрдВ рдЗрд╕ рдЫреЛрдЯреЗ рдкреЛрд╕реНрдЯ-рдиреЛрдЯ
рдпрд╛ рддрд╛рдкрдорд╛рди рдмрдХрд╡рд╛рд╕ (рдУрдбреЗрд╕рд╛ рдореЗрдВ рдардВрдбрд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ
, рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ
) Object.defineProperty (рдФрд░ Object.defineProperties) рдЬреИрд╕реЗ рд╢рд╛рдирджрд╛рд░ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдПред рдореИрдВ рд▓рдЧрднрдЧ рджреЛ рдорд╣реАрдиреЗ рд╕реЗ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЬрд┐рд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЙрд╕рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ (IE8 рд╕рд╣рд┐рдд) рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдИрд░реНрд╖реНрдпрд╛)ред
рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рд╣рдмреНрд░ рдкрд░ рдПрдХ рд▓реЗрдЦ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдореИрдВ рдЗрд╕рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред Object.defineProperty рдПрдХ рдирдИ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЧреИрд░-рдорд╛рдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рддреАрди рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ:
- рдПрдХ рдирдИ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рдХрд░ рд╣рдо рдЬрд┐рд╕ рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ
- рд╕рдВрдкрддреНрддрд┐ (рд╕реНрдЯреНрд░рд┐рдВрдЧ), рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
- рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░: рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬрд┐рд╕рдореЗрдВ рдирдИ рд╕рдВрдкрддреНрддрд┐ рдХреА "рд╕реЗрдЯрд┐рдВрдЧ" рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрд╕реЗрд╕рд░ (рдЧреЗрдЯреНрдЯрд░, рд╕реЗрдЯрд░)
рд╡рд┐рд╡рд░рдгрдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
- рдорд╛рди (рдХреЛрдИ рднреА рдореВрд▓реНрдп: рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдлрд╝рдВрдХреНрд╢рди ...) - рд╡рд╣ рдорд╛рди рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
- рд▓реЗрдЦрди рдпреЛрдЧреНрдп (рд╕рддреНрдп / рдЕрд╕рддреНрдп) - рдХреНрдпрд╛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рднреА рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ)
- get (рдлрд╝рдВрдХреНрд╢рди) - getter (рдорд╛рди рдФрд░ рд▓реЗрдЦрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛)
- рд╕реЗрдЯ (рдлрд╝рдВрдХреНрд╢рди) - рд╕реЗрдЯрд░ (рдореВрд▓реНрдп рдФрд░ рд▓реЗрдЦрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛)
- рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп (рд╕рддреНрдп / рдЕрд╕рддреНрдп) - рдХреНрдпрд╛ рд╣реИрдВрдбрд▓ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ (рдЙрд╕реА рдкреНрд░реЙрдкрд░реНрдЯреА рдкрд░ Object.defineProperty рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)
- enumerable (рд╕рд╣реА / рдЧрд▓рдд) - рдХреНрдпрд╛ рд╕рдВрдкрддреНрддрд┐ for..in рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рдПрдЧреА рдФрд░ Object.keys (рдЦрд░рд╛рдм рд╢рдмреНрджреЛрдВ) рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ
рдЙрджрд╛рд╣рд░рдгрдЕрдВрддрд░реНрд╡рд╕реНрддреБ
рдПрдордбреАрдПрди рдСрдмреНрдЬреЗрдХреНрдЯ / рдбрд┐рдлрд╛рдЗрдирдкреНрд░реЛрдкрд░реНрдЯреА рдореБрдЭреЗ рдмреЗрд╣рддрд░ рд╕рдордЭрд╛рдПрдЧрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдкрдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рде рдХрдИ рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк Object.defineProperties рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рддрд░реНрдХ рд╣реИрдВ: рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реА рдПрдХ рд╡рд╕реНрддреБ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБред
рдПрдордбреАрдПрди :
рдСрдмреНрдЬреЗрдХреНрдЯ / рдбрд┐рдлрд╛рдЗрдирдкреНрд░реЛрдкрд░реЗрдЯреА ред
рдЙрджрд╛рд╣рд░рдгрдЕрдВрддрд░реНрд╡рд╕реНрддреБ
рдЕрдм рдирдордХред рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХреНрдпрд╛ рдХрд┐рдпрд╛?
рдЪреВрдВрдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореБрдЭреЗ рди рдХреЗрд╡рд▓ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ, рдмрд▓реНрдХрд┐ рдмрд╣реБрдд рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ, рдХреЛрдб рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕реЗ рд╣рд▓реНрдХрд╛, рдмрджрд╕реВрд░рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдЪрд╛рд░ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдпрд╛ (рдореИрдВ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХреИрд╕реЗ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рдерд╛?), рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдмрдирд╛ рджрд┐рдпрд╛ред рдЦрд░рд╛рдм рдЯреЛрди, рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдирдП рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд▓рд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдпрд╣ рд░рд╛рдп рдХрд╣рд╛рдВ рд╕реЗ рдЖрдИ? рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗрдЧреА, рдЬреЛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде, for..in рдореЗрдВ рдПрдиреБрдорд░реЗрдЯреЗрдб рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЬрдм рдЖрдк рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдореЗрд░рд╛ рджрд┐рд▓ рдЧрд░реНрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдЕрд╕рдВрдЦреНрдп рд╡рд┐рд╡рд░рдгрдХ рдХреА рд╕рдВрдкрддреНрддрд┐ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛:
Object.defineProperty( Object.prototype, 'logOk' { value: function() { console.log('ok') }, enumerable: false });
рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдпрд╣ рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдпрд╣ рдЧреИрд░-рдЧрдгрдирд╛ рдпреЛрдЧреНрдп рд╣реЛрдЧреА (рдпрджрд┐ рдЖрдкрдХреЛ рдРрд╕реА рд╕рдВрдкрддреНрддрд┐ рд╣реИ, рддреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ hasOwnProperty рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ):
var o = {a: 1, b: 2} for( var i in o ) console.log( i, o[ i ] ); > a 1 > b 2 o.logOk(); > ok
рджрд░рдЕрд╕рд▓, рдореИрдВ рдпрд╣рд╛рдВ рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖ рд░рд╣рд╛ рд╣реВрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ рдЕрдкрдиреА рд░рд╛рдп рдореЗрдВ, рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЕрддрд┐рднрд╛рд░рд┐рдд рди рдХрд╣реВрдВред рджреВрд╕рд░рд╛, рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рдиреЛрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬреЛ рдЧреИрд░-рдПрдиреНрдпреВрдорд░рдмрд▓ рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред
Object.defineProperties( Object.prototype, { define: { value: function( key, descriptor ) { if( descriptor ) { Object.defineProperty( this, key, descriptor ); } else { Object.defineProperties( this, key ); } return this; }, enumerable: false }, extendNotEnum: { value: function( key, property ) { if( property ) { this.define( key, { value: property, enumerable: false, configurable: true }); } else { for( var prop in key ) if( key.hasOwnProperty( prop ) ){ this.extendNotEnum( prop, key[ prop ] ); } } }, enumerable: false } });
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
var o = { a: 1 }; o.define( 'randomInt', { get: function() { return 42; } }); o.extendNotEnum({ b: 2; }); for( var i in o ) console.log( i, o[ i ] ); > a 1 > randomInt 42 console.log( ob ); > 2
рдФрд░ рд╡рд╣ рдЪрд▓реА рдЧрдИ ... рджреЛ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ:
Object.prototype.extendNotEnum({ extend: function() { var args = Array.prototype.slice.call( arguments ); args.unshift( this ); return $.extend.apply( null, args );
o.extend({c: 3});
рдЖрдк рдирдП рдЧреБрдг рдРрдб рдЗрдирдлрд╝рд┐рдирд┐рдЯрдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдЖрдкрдХрд╛ рд╣рд╛рде рдирд╣реАрдВ рдХрд╛рдЯреЗрдЧрд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдмрд╛рдВрдХрд╛ рдЦреЗрд▓реЛ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗрдВ, рдЬреЛ рдмреЗрд╣рддрд░ рдФрд░ рдмреЗрд╣рддрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИред
(рдпрджрд┐ рдЖрдк рдПрдХ рдЯрд╛рдЗрдкреЛ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐ рдиреЛрдЯрд┐рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВ)