2 * copy-descriptor <https://github.com/jonschlinkert/copy-descriptor>
4 * Copyright (c) 2015, Jon Schlinkert.
5 * Licensed under the MIT License.
11 * Copy a descriptor from one object to another.
17 * App.prototype.set = function(key, val) {
18 * this.cache[key] = val;
21 * Object.defineProperty(App.prototype, 'count', {
23 * return Object.keys(this.cache).length;
27 * copy(App.prototype, 'count', 'len');
29 * // create an instance
30 * var app = new App();
36 * console.log(app.count);
38 * console.log(app.len);
42 * @param {Object} `receiver` The target object
43 * @param {Object} `provider` The provider object
44 * @param {String} `from` The key to copy on provider.
45 * @param {String} `to` Optionally specify a new key name to use.
50 module.exports = function copyDescriptor(receiver, provider, from, to) {
51 if (!isObject(provider) && typeof provider !== 'function') {
56 if (!isObject(receiver) && typeof receiver !== 'function') {
57 throw new TypeError('expected the first argument to be an object');
59 if (!isObject(provider) && typeof provider !== 'function') {
60 throw new TypeError('expected provider to be an object');
63 if (typeof to !== 'string') {
66 if (typeof from !== 'string') {
67 throw new TypeError('expected key to be a string');
70 if (!(from in provider)) {
71 throw new Error('property "' + from + '" does not exist');
74 var val = Object.getOwnPropertyDescriptor(provider, from);
75 if (val) Object.defineProperty(receiver, to, val);
78 function isObject(val) {
79 return {}.toString.call(val) === '[object Object]';