| /*! |
| * merge-descriptors |
| * Copyright(c) 2014 Jonathan Ong |
| * Copyright(c) 2015 Douglas Christopher Wilson |
| * MIT Licensed |
| */ |
| |
| 'use strict' |
| |
| /** |
| * Module exports. |
| * @public |
| */ |
| |
| module.exports = merge |
| |
| /** |
| * Module variables. |
| * @private |
| */ |
| |
| var hasOwnProperty = Object.prototype.hasOwnProperty |
| |
| /** |
| * Merge the property descriptors of `src` into `dest` |
| * |
| * @param {object} dest Object to add descriptors to |
| * @param {object} src Object to clone descriptors from |
| * @param {boolean} [redefine=true] Redefine `dest` properties with `src` properties |
| * @returns {object} Reference to dest |
| * @public |
| */ |
| |
| function merge(dest, src, redefine) { |
| if (!dest) { |
| throw new TypeError('argument dest is required') |
| } |
| |
| if (!src) { |
| throw new TypeError('argument src is required') |
| } |
| |
| if (redefine === undefined) { |
| // Default to true |
| redefine = true |
| } |
| |
| Object.getOwnPropertyNames(src).forEach(function forEachOwnPropertyName(name) { |
| if (!redefine && hasOwnProperty.call(dest, name)) { |
| // Skip desriptor |
| return |
| } |
| |
| // Copy descriptor |
| var descriptor = Object.getOwnPropertyDescriptor(src, name) |
| Object.defineProperty(dest, name, descriptor) |
| }) |
| |
| return dest |
| } |