/**
* Shorthand helper for building descriptors up from a prototype chain.
- * @param {*} proto
- * @param {...any} objs
- * @returns {Object}
+ * @param {object} proto prototype object
+ * @param {object[]} objs objects to assign to derived object, in order
+ * @returns {object} new object
*/
function createAssign(proto, ...objs) {
return Object.assign(Object.create(proto), ...objs);
set: undefined,
});
+/**
+ * @typedef {object} PropertyDescriptor
+ * @property {boolean=} configurable some things can be changed
+ * @property {boolean=} enumerable shows up in places
+ * @property {boolean=} writable value can be changed
+ * @property {any=} value value
+ * @property {Function=} get getter
+ * @property {Function=} set setter
+ */
+
/**
* Defer calling initializer to set value for name until name is read.
* If a lazy property is defined on an object which is used as a prototype,
* object, or for any inherited object and set the property on that object.
* The objectBound flag also controls the 'this' object of the initializer
* when called.
- * @param {Object} obj
- * @param {String} name
- * @param {() => {*}} initializer
- * @param {Object=} descriptor
- * @param {Boolean=} descriptor.configurable
- * @param {Boolean=} descriptor.enumerable
- * @param {Boolean=} descriptor.writable
- * @param {Boolean=} objectBound
+ * @param {object} obj object
+ * @param {string} name property name
+ * @param {Function} initializer function which returns value to set on property upon first access
+ * @param {PropertyDescriptor=} descriptor optional descriptor
+ * @param {boolean=} objectBound bind initializer to obj
+ * @returns {object} obj with lazy property
*/
function lazy(obj, name, initializer, descriptor, objectBound = true) {
if (typeof initializer !== 'function') {
set: function (value) {
Object.defineProperty(this, name, createAssign(defaultDataDescriptor, {
value,
- }))
+ }));
},
}),