* merge.js

/*!
 * 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
}

* index.js

var merge = require('./merge');

var src = {
    a: 0,
    b: 1,
    c: 2
}

var dst = {a: 3, d: 4};

// 最后一个参数表示 不覆盖源对象?
// false 表示覆盖源对象 
var ans = merge(dst, src, true); // { a: 0, d: 4, b: 1, c: 2 }
// var ans = merge(dst, src, false); // { a: 3, d: 4, b: 1, c: 2 }
console.log(ans);

 

merge.js npm包来源:

npm install --save merge-descriptors