
рдЕрдкрдиреЗ рдПрдЯрдореЛрдЬрд╝ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ, рдореИрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░:
Foo = atom.Class({ get bar () { return this._bar; }, set bar (bar) { this._bar = bar; } });
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдореИрдВ рд╕рднреА рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛, рдЕрд░реНрдерд╛рддреН рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП рдХрд┐ рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ 9 рдХреЛ
__defineSetter__
рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реИред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИрдВред IE9 +, Opera10 +, Fx3.5 +, Chrome - рд╕рднреА рдЗрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ 9 рдореЗрдВ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ "
рд╕рдВрднрд╡рддрдГ "
':'
' - рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдиреЗ "рдЗрдВрдЯрд░рдЧрд┐рдпрд░ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ 7" рдХреЗ
"рдмреИрдЧреЛрдбреНрд░реЛрдо" рдореЛрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рд╣реИ
рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ
рдЕрдорд╛рдирдХ рдХреЗ рд▓рд┐рдП
__defineSetter__
__defineSetter__
рдФрд░
__defineGetter__
__defineGetter__
рд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ -
Object.defineProperty ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ
configurable
рдХрд░рдиреЗ
configurable
рдФрд░
enumerable
рдЧреБрдгреЛрдВ рдХреЛ рд╕рд╣реА рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рдорд╛рдирдХ рд╡рд┐рдХрд▓реНрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
instance.__defineSetter__(propertyName, setterFn); instance.__defineGetter__(propertyName, getterFn);
рдЕрдорд╛рдирдХ рдХреЗ рд▓рд┐рдП
__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'));
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ:
console.log(instance.foo);
1. рдпрд╣ рдореБрдЭреЗ рдЧреИрд░-рдорд╛рдирдХ рдЧреБрдгреЛрдВ рдХрд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд▓рдЧрддрд╛ рд╣реИ
2. рдпрд╣ рдореЗрд░реЗ рдврд╛рдВрдЪреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓ рд╣реИред
3. рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВред рдХрд┐рддрдирд╛ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкреБрди: рдЖрд╡рд░реНрддрдХ рд░реВрдк рд╕реЗ рдкреВрд░реА рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП
Object.getPrototypeOf рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдпрд╛ рддреЛ
null
, рдпрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдкрддреНрддрд┐ рдпрд╛
рдПрдХреНрд╕реЗрд╕рд░ рдореЗрдВ рдирд╣реАрдВ рдЪрд▓рддреЗ рд╣реИрдВред
function getPropertyDescriptor (from, key) { var descriptor = Object.getOwnPropertyDescriptor(from, key); if (!descriptor) {
рдпрд╣ рд╕рдм рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛
рдЕрдм рд╣рдо рдЕрдзрд┐рдЧреНрд░рд╣реАрдд рдЬреНрдЮрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреНрд░реЙрд╕-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЧреИрд░-рдорд╛рдирдХ рддрд░реАрдХреЗ рдереЛрдбрд╝реА рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрдо рд╣реИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЪрд▓реЛ рдЙрдиреНрд╣реЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рдирд╛рдо
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);
рд╡рд┐рд░рд╛рд╕рдд
рдЕрдм
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') );
рд╣рдо рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦреЗрдВрдЧреЗ (рдзреНрдпрд╛рди рджреЗрдВ, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)
function extend(from, to) { for (var i in to) {
рдирд┐рд╖реНрдХрд░реНрд╖
рдмрд╛рдд рдмрд╣реБрдд рд╕рд╣рдЬ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рджреЛ рдЕрддрд┐-рд╡рд┐рд╢рд┐рд╖реНрдЯ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд░реВрдкрд░реЗрдЦрд╛рдПрдБ рд╣реИрдВ -
рдПрдЯрдореЙрдЬрд╝ рдФрд░
рд▓рд┐рдмрдХрдирд╡рд╛рд╕ , рдЬрд╣рд╛рдВ
рдПрдХреНрд╕реЗрд╕рд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдк рдиреМрд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдиреАрдЪреЗ рдЧрдзреЛрдВ рдХреЛ рджреЗрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рддреЛ рдмрд╣реБрдд рдЖрдирдВрдж рд▓реЗрдВред
рд╡рд┐рд╖рдп рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдорд╛рдзрд╛рди, рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд, рд╢реБрд░реВ рдореЗрдВ
рдПрдЯреЙрдордЬрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
- рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рдкреНрд▓рдЧрдЗрди ред