рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреНрд░реЙрд╕рдмреЛрд╡рд░ рдПрдХреНрд╕реЗрд╕рд░реНрд╕


рдЕрдкрдиреЗ рдПрдЯрдореЛрдЬрд╝ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ, рдореИрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░:

Foo = atom.Class({ get bar () { return this._bar; }, set bar (bar) { this._bar = bar; } }); 


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



рдорд┐рд▓ / рд╕реЗрдЯ


рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИрдВред IE9 +, Opera10 +, Fx3.5 +, Chrome - рд╕рднреА рдЗрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ 9 рдореЗрдВ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ " рд╕рдВрднрд╡рддрдГ " ':' ' - рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдиреЗ "рдЗрдВрдЯрд░рдЧрд┐рдпрд░ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ 7" рдХреЗ "рдмреИрдЧреЛрдбреНрд░реЛрдо" рдореЛрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рд╣реИ

defineProperty


рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ

рдЕрдорд╛рдирдХ рдХреЗ рд▓рд┐рдП __defineSetter__ __defineSetter__ рдФрд░ __defineGetter__ __defineGetter__ рд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ - Object.defineProperty ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ configurable рдХрд░рдиреЗ configurable рдФрд░ enumerable рдЧреБрдгреЛрдВ рдХреЛ рд╕рд╣реА рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдорд╛рдирдХ рд╡рд┐рдХрд▓реНрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 instance.__defineSetter__(propertyName, setterFn); instance.__defineGetter__(propertyName, getterFn); // => Object.defineProperty(instance, propertyName, { set: setterFn, get: getterFn, enumerable : true, configurable: true }); 


getOwnPropertyDescriptor


рдЕрдорд╛рдирдХ рдХреЗ рд▓рд┐рдП __lookupSetter__ __lookupSetter__ рдФрд░ __lookupGetter__ __lookupGetter__ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рднреА рд╣реИ - Object.getOwnPropertyDescriptor ред

рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдХрдо рд╣рд░реНрд╖рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рд░рд╣рд╕реНрдп рдпрд╣ рд╣реИ рдХрд┐ __lookup*__ рд╕рдВрдкреВрд░реНрдг рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдПрдХ __lookup*__ рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ getOwnPropertyDescriptor рдХреЗрд╡рд▓ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЧреБрдгреЛрдВ рдореЗрдВ:
рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЧреБрдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╡рд┐рд╡рд░рдгрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдкрд░ рд╕реАрдзреЗ рдореМрдЬреВрдж рд╣реЛрддрд╛ рд╣реИ, рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рд╣реЛрдиреЗ рдХреЗ рд╕рдВрдХреЗрдд рд╕реЗ рдЙрдкрд╕реНрдерд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ)ред


рдЕрд░реНрдерд╛рддреН, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рд╕реНрдерд┐рддрд┐ рд╣реИ :
 var MyClass = function () {}; MyClass.prototype = { get foo() { return 42; } }; var instance = new MyClass(); console.log(instance.__lookupGetter__('foo')); // function foo() { return 42; } console.log(Object.getOwnPropertyDescriptor(instance, 'foo')); // undefined 


рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ:
 console.log(instance.foo); // 42 


1. рдпрд╣ рдореБрдЭреЗ рдЧреИрд░-рдорд╛рдирдХ рдЧреБрдгреЛрдВ рдХрд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд▓рдЧрддрд╛ рд╣реИ
2. рдпрд╣ рдореЗрд░реЗ рдврд╛рдВрдЪреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓ рд╣реИред
3. рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВред рдХрд┐рддрдирд╛ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкреБрди: рдЖрд╡рд░реНрддрдХ рд░реВрдк рд╕реЗ рдкреВрд░реА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП Object.getPrototypeOf рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдпрд╛ рддреЛ null , рдпрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдкрддреНрддрд┐ рдпрд╛ рдПрдХреНрд╕реЗрд╕рд░ рдореЗрдВ рдирд╣реАрдВ рдЪрд▓рддреЗ рд╣реИрдВред

 function getPropertyDescriptor (from, key) { var descriptor = Object.getOwnPropertyDescriptor(from, key); if (!descriptor) { //     -       var proto = Object.getPrototypeOf(from); if (proto) return getPropertyDescriptor(proto, key); //   , ,       (   ) } else if ( descriptor.set || descriptor.get ) { return { set: descriptor.set, get: descriptor.get }; } //    ,       return null; }; 


рдпрд╣ рд╕рдм рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛


рдЕрдм рд╣рдо рдЕрдзрд┐рдЧреНрд░рд╣реАрдд рдЬреНрдЮрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреНрд░реЙрд╕-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЧреИрд░-рдорд╛рдирдХ рддрд░реАрдХреЗ рдереЛрдбрд╝реА рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрдо рд╣реИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЪрд▓реЛ рдЙрдиреНрд╣реЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдирд╛рдо lookup рдФрд░ define - рд╡реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд▓реБрдХрдЕрдк рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рд╛рдордЧреНрд░реА рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╣рд░ рдмрд╛рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ
 (function (Object) { var standard = !!Object.getOwnPropertyDescriptor, nonStandard = !!{}.__defineGetter__; if (!standard && !nonStandard) throw new Error('Accessors are not supported'); var lookup = nonStandard ? function (from, key) { var g = from.__lookupGetter__(key), s = from.__lookupSetter__(key); return ( g || s ) ? { get: g, set: s } : null; } : function (from, key) { var descriptor = Object.getOwnPropertyDescriptor(from, key); if (!descriptor) { var proto = Object.getPrototypeOf(from); if (proto) return accessors.lookup(proto, key); } else if ( descriptor.set || descriptor.get ) { return { set: descriptor.set, get: descriptor.get }; } return null; }; var define = nonStandard ? function (object, prop, descriptor) { if (descriptor) { if (descriptor.get) object.__defineGetter__(prop, descriptor.get); if (descriptor.set) object.__defineSetter__(prop, descriptor.set); } return object; } : function (object, prop, descriptor) { if (descriptor) { var desc = { get: descriptor.get, set: descriptor.set, configurable: true, enumerable: true }; Object.defineProperty(object, prop, desc); } return object; }; this.accessors = { lookup: lookup, define: define }; })(Object); 


рдЕрдм рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 MyClass = function (param) { var property = param; accessors.define(this, 'property', { set: function (value) { property = value; }, get: function () { return property; } }); }; var instance = new MyClass(42); console.log(instance.property); // 42 console.log(accessors.lookup(instance, 'property')); // getter+setter 


рд╡рд┐рд░рд╛рд╕рдд


рдЕрдм inherit рдкрджреНрдзрддрд┐ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВред рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ key рдирд╛рдо рдХреА рдПрдХ рдкреНрд░реЙрдкрд░реНрдЯреА рдПрдХреНрд╕реЗрд╕рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдЕрдЧрд░ рд╕рдлрд▓ рд╣реЛ, рддреЛ true , рдЕрдиреНрдпрдерд╛ false ред
  this.accessors = { lookup: lookup, define: define, inherit: function (from, to, key) { var a = accessors.lookup(from, key); if ( a ) { accessors.define(to, key, a); return true; } return false; } }; 


рдпрд╣ рд╡рд┐рдзрд┐ рд╣рдореЗрдВ Object.merge рд╕реЗ jQuery.extend рдпрд╛ Object.merge рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреА рдЬреЛ MooTools рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рдЬрдмрдХрд┐ рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рдлреНрд░реЗрдорд╡рд░реНрдХ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ:

 var object = jQuery.extend({}, { get foo(){ return null; } }); console.log( object.__lookupGetter__('foo') ); // undefined console.log( object.foo ); // null 


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

 function extend(from, to) { for (var i in to) { //    if (!accessors.inherit(from, to, i)) { //     -    from[i] = to[i]; } } return from; }; var object = extend({}, { get foo(){ return null; } }); console.log( object.__lookupGetter__('foo') ); // getter console.log( object.foo ); // null 


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


рдмрд╛рдд рдмрд╣реБрдд рд╕рд╣рдЬ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рджреЛ рдЕрддрд┐-рд╡рд┐рд╢рд┐рд╖реНрдЯ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд░реВрдкрд░реЗрдЦрд╛рдПрдБ рд╣реИрдВ - рдПрдЯрдореЙрдЬрд╝ рдФрд░ рд▓рд┐рдмрдХрдирд╡рд╛рд╕ , рдЬрд╣рд╛рдВ рдПрдХреНрд╕реЗрд╕рд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдк рдиреМрд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдиреАрдЪреЗ рдЧрдзреЛрдВ рдХреЛ рджреЗрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рддреЛ рдмрд╣реБрдд рдЖрдирдВрдж рд▓реЗрдВред

рд╡рд┐рд╖рдп рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдорд╛рдзрд╛рди, рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд, рд╢реБрд░реВ рдореЗрдВ рдПрдЯреЙрдордЬрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдкреНрд▓рдЧрдЗрди ред

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


All Articles