Object.defineProperty рдпрд╛ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП

рдореИрдВ рдЗрд╕ рдЫреЛрдЯреЗ рдкреЛрд╕реНрдЯ-рдиреЛрдЯ рдпрд╛ рддрд╛рдкрдорд╛рди рдмрдХрд╡рд╛рд╕ (рдУрдбреЗрд╕рд╛ рдореЗрдВ рдардВрдбрд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ , рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ ) Object.defineProperty (рдФрд░ Object.defineProperties) рдЬреИрд╕реЗ рд╢рд╛рдирджрд╛рд░ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдПред рдореИрдВ рд▓рдЧрднрдЧ рджреЛ рдорд╣реАрдиреЗ рд╕реЗ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЬрд┐рд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЙрд╕рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ (IE8 рд╕рд╣рд┐рдд) рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдИрд░реНрд╖реНрдпрд╛)ред

рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рд╣рдмреНрд░ рдкрд░ рдПрдХ рд▓реЗрдЦ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдореИрдВ рдЗрд╕рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред Object.defineProperty рдПрдХ рдирдИ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЧреИрд░-рдорд╛рдирдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рддреАрди рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ:

рд╡рд┐рд╡рд░рдгрдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

рдЙрджрд╛рд╣рд░рдг
рдЕрдВрддрд░реНрд╡рд╕реНрддреБ
//    MDN var o = {}; Object.defineProperty(o, "a", {value : 37, writable : true, enumerable : true, configurable : true}); var bValue; Object.defineProperty(o, "b", {get : function(){ return bValue; }, set : function(newValue){ bValue = newValue; }, enumerable : true, configurable : true}); 


рдПрдордбреАрдПрди рдСрдмреНрдЬреЗрдХреНрдЯ / рдбрд┐рдлрд╛рдЗрдирдкреНрд░реЛрдкрд░реНрдЯреА рдореБрдЭреЗ рдмреЗрд╣рддрд░ рд╕рдордЭрд╛рдПрдЧрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдкрдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рде рдХрдИ рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк Object.defineProperties рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рддрд░реНрдХ рд╣реИрдВ: рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реА рдПрдХ рд╡рд╕реНрддреБ рдФрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд╕реНрддреБред
рдПрдордбреАрдПрди : рдСрдмреНрдЬреЗрдХреНрдЯ / рдбрд┐рдлрд╛рдЗрдирдкреНрд░реЛрдкрд░реЗрдЯреА ред

рдЙрджрд╛рд╣рд░рдг
рдЕрдВрддрд░реНрд╡рд╕реНрддреБ
 //    MDN Object.defineProperties(obj, { "property1": { value: true, writable: true }, "property2": { value: "Hello", writable: false } // etc. etc. }); 



рдЕрдм рдирдордХред рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХреНрдпрд╛ рдХрд┐рдпрд╛?

рдЪреВрдВрдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореБрдЭреЗ рди рдХреЗрд╡рд▓ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ, рдмрд▓реНрдХрд┐ рдмрд╣реБрдд рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ, рдХреЛрдб рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕реЗ рд╣рд▓реНрдХрд╛, рдмрджрд╕реВрд░рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдЪрд╛рд░ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрдпрд╛ (рдореИрдВ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХреИрд╕реЗ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рдерд╛?), рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдмрдирд╛ рджрд┐рдпрд╛ред рдЦрд░рд╛рдм рдЯреЛрди, рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдирдП рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рд▓рд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдпрд╣ рд░рд╛рдп рдХрд╣рд╛рдВ рд╕реЗ рдЖрдИ? рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗрдЧреА, рдЬреЛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде, 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 ); //  jQuery ,      }, each: function( callback ) { return $.each( this, callback ); //  } }); 


 o.extend({c: 3}); //       o.each(function( key, value ) { //    $.each,      }); 


рдЖрдк рдирдП рдЧреБрдг рдРрдб рдЗрдирдлрд╝рд┐рдирд┐рдЯрдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдЖрдкрдХрд╛ рд╣рд╛рде рдирд╣реАрдВ рдХрд╛рдЯреЗрдЧрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖

рдмрд╛рдВрдХрд╛ рдЦреЗрд▓реЛ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗрдВ, рдЬреЛ рдмреЗрд╣рддрд░ рдФрд░ рдмреЗрд╣рддрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИред

(рдпрджрд┐ рдЖрдк рдПрдХ рдЯрд╛рдЗрдкреЛ рдпрд╛ рдЕрд╢реБрджреНрдзрд┐ рдиреЛрдЯрд┐рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВ)

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


All Articles