
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