Skip to content
Snippets Groups Projects
index.js 1.19 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jay's avatar
    Jay committed
    /*!
     * 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
    }