extend.js 1.0 KB

12345678910111213141516171819202122232425262728293031323334
  1. var isFunction = require('./type/is-function');
  2. var mix = require('./mix');
  3. var extend = function extend(subclass, superclass, overrides, staticOverrides) {
  4. // 如果只提供父类构造函数,则自动生成子类构造函数
  5. if (!isFunction(superclass)) {
  6. overrides = superclass;
  7. superclass = subclass;
  8. subclass = function subclass() {};
  9. }
  10. var create = Object.create ? function (proto, c) {
  11. return Object.create(proto, {
  12. constructor: {
  13. value: c
  14. }
  15. });
  16. } : function (proto, c) {
  17. function Tmp() {}
  18. Tmp.prototype = proto;
  19. var o = new Tmp();
  20. o.constructor = c;
  21. return o;
  22. };
  23. var superObj = create(superclass.prototype, subclass); // new superclass(),//实例化父类作为子类的prototype
  24. subclass.prototype = mix(superObj, subclass.prototype); // 指定子类的prototype
  25. subclass.superclass = create(superclass.prototype, superclass);
  26. mix(superObj, overrides);
  27. mix(subclass, staticOverrides);
  28. return subclass;
  29. };
  30. module.exports = extend;