Foo = atom.Class({ get bar () { return this._bar; }, set bar (bar) { this._bar = bar; } });
__defineSetter__
and similar methods.':'
" - check whether the browser has switched to the __defineSetter__
__defineSetter__
and __defineGetter__
__defineGetter__
is an alternative from EcmaScript5 - Object.defineProperty . By default, the properties of the configurable
and enumerable
are declared as true, so we can easily write a standard alternative: instance.__defineSetter__(propertyName, setterFn); instance.__defineGetter__(propertyName, getterFn); // => Object.defineProperty(instance, propertyName, { set: setterFn, get: getterFn, enumerable : true, configurable: true });
__lookupSetter__
__lookupSetter__
and __lookupGetter__
__lookupGetter__
also has an alternative from EcmaScript5 - Object.getOwnPropertyDescriptor .__lookup*__
looking for an accessor along the entire prototype chain, while getOwnPropertyDescriptor
is only in personal properties:This is a subject object of a given object.
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
null
, or on a specific property or accessor. 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
and define
- they are concise and understandable, that's why we use them. (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
method. It will get the property accessor named key
from the from object, and add it to the to object. If successful, returns true
, otherwise returns 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; } };
jQuery.extend
or Object.merge
from MooTools
that supports accessors, while all regular frameworks do not know anything about them: 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/117803/
All Articles