mixin-prototypes.js 996 B

12345678910111213141516171819202122232425262728293031323334
  1. 'use strict';
  2. var value = require('./valid-value')
  3. , mixin = require('./mixin')
  4. , defineProperty = Object.defineProperty
  5. , getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor
  6. , getOwnPropertyNames = Object.getOwnPropertyNames
  7. , getPrototypeOf = Object.getPrototypeOf
  8. , hasOwnProperty = Object.prototype.hasOwnProperty;
  9. module.exports = function (target, source) {
  10. var error, end, define;
  11. target = Object(value(target));
  12. source = Object(value(source));
  13. end = getPrototypeOf(target);
  14. if (source === end) return target;
  15. try {
  16. mixin(target, source);
  17. } catch (e) { error = e; }
  18. source = getPrototypeOf(source);
  19. define = function (name) {
  20. if (hasOwnProperty.call(target, name)) return;
  21. try {
  22. defineProperty(target, name, getOwnPropertyDescriptor(source, name));
  23. } catch (e) { error = e; }
  24. };
  25. while (source && (source !== end)) {
  26. getOwnPropertyNames(source).forEach(define);
  27. source = getPrototypeOf(source);
  28. }
  29. if (error) throw error;
  30. return target;
  31. };