You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
1.9 KiB
81 lines
1.9 KiB
/*! |
|
* copy-descriptor <https://github.com/jonschlinkert/copy-descriptor> |
|
* |
|
* Copyright (c) 2015, Jon Schlinkert. |
|
* Licensed under the MIT License. |
|
*/ |
|
|
|
'use strict'; |
|
|
|
/** |
|
* Copy a descriptor from one object to another. |
|
* |
|
* ```js |
|
* function App() { |
|
* this.cache = {}; |
|
* } |
|
* App.prototype.set = function(key, val) { |
|
* this.cache[key] = val; |
|
* return this; |
|
* }; |
|
* Object.defineProperty(App.prototype, 'count', { |
|
* get: function() { |
|
* return Object.keys(this.cache).length; |
|
* } |
|
* }); |
|
* |
|
* copy(App.prototype, 'count', 'len'); |
|
* |
|
* // create an instance |
|
* var app = new App(); |
|
* |
|
* app.set('a', true); |
|
* app.set('b', true); |
|
* app.set('c', true); |
|
* |
|
* console.log(app.count); |
|
* //=> 3 |
|
* console.log(app.len); |
|
* //=> 3 |
|
* ``` |
|
* @name copy |
|
* @param {Object} `receiver` The target object |
|
* @param {Object} `provider` The provider object |
|
* @param {String} `from` The key to copy on provider. |
|
* @param {String} `to` Optionally specify a new key name to use. |
|
* @return {Object} |
|
* @api public |
|
*/ |
|
|
|
module.exports = function copyDescriptor(receiver, provider, from, to) { |
|
if (!isObject(provider) && typeof provider !== 'function') { |
|
to = from; |
|
from = provider; |
|
provider = receiver; |
|
} |
|
if (!isObject(receiver) && typeof receiver !== 'function') { |
|
throw new TypeError('expected the first argument to be an object'); |
|
} |
|
if (!isObject(provider) && typeof provider !== 'function') { |
|
throw new TypeError('expected provider to be an object'); |
|
} |
|
|
|
if (typeof to !== 'string') { |
|
to = from; |
|
} |
|
if (typeof from !== 'string') { |
|
throw new TypeError('expected key to be a string'); |
|
} |
|
|
|
if (!(from in provider)) { |
|
throw new Error('property "' + from + '" does not exist'); |
|
} |
|
|
|
var val = Object.getOwnPropertyDescriptor(provider, from); |
|
if (val) Object.defineProperty(receiver, to, val); |
|
}; |
|
|
|
function isObject(val) { |
|
return {}.toString.call(val) === '[object Object]'; |
|
} |
|
|
|
|