extend-properties.js
 1  'use strict';
 2  
 3  var forEach                  = Array.prototype.forEach
 4    , slice                    = Array.prototype.slice
 5    , defineProperties         = Object.defineProperties
 6    , getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor
 7    , getOwnPropertyNames      = Object.getOwnPropertyNames
 8    , value                    = require('./valid-value')
 9    , extend;
10  
11  extend = function (properties, src) {
12  	getOwnPropertyNames(src).forEach(function (key) {
13  		var desc;
14  		if (!(desc = getOwnPropertyDescriptor(this, key)) || desc.configurable) {
15  			properties[key] = getOwnPropertyDescriptor(src, key);
16  		}
17  	}, this);
18  };
19  
20  module.exports = function (dest, src) {
21  	var properties;
22  	forEach.call(arguments, value);
23  	slice.call(arguments, 1).forEach(extend.bind(dest, properties = {}));
24  	return defineProperties(dest, properties);
25  };