jQuery无new构建实例

  1. var jQuery = function () {
  2. return new jQuery.prototype.init();
  3. }
  4. jQuery.fn = jQuery.prototype = {
  5. jquery: version,
  6. // 共享原型
  7. init: function () {
  8. // 与jQuery共享一个原型对象
  9. },
  10. css: function () {
  11. }
  12. }

共享原型设计

  1. // init共享jQuery原型对象,
  2. jQuery.fn.init.prototype = jQuery.fn;

extend源码设计

  1. /**
  2. * @description 实现对于jQuery或者jQuery实例的扩展,或者对于任意对象的扩展
  3. * @params 第一个参数为{},并且只有一个参数则为jQuery或者jQuery实例的扩展
  4. * 第一参数为Boolean,并且为true,则为深拷贝,
  5. * @type {function(): any}
  6. */
  7. jQuery.extend = jQuery.fn.extend = function () {
  8. var target = arguments[0] || {};
  9. var isDeep; // 是否是一个深拷贝
  10. var i = 1; // 因为对象扩展的时候第一个参数是不需要动的,所以从1开始
  11. var length = arguments.length;
  12. // 如果是第一个参数是Boolean,为true是深拷贝
  13. if (typeof target === 'boolean') {
  14. isDeep = target;
  15. target = arguments[1];
  16. i = 2;
  17. }
  18. // 第一个参数必须为Object
  19. if (typeof target !== 'object') {
  20. target = {};
  21. }
  22. // 判断当前参数的个数
  23. if (i === length) {
  24. // 只有1个参数用于对jQuery或jQuery实例扩展静态属性及方法,
  25. // 1个参数以上用于给任意对象的扩展
  26. target = this;
  27. // 从0开始,用于扩展每个属性和方法
  28. i--;
  29. }
  30. for (; i < length; i++) {
  31. var options, name, copy, src, clone, copyIsArray;
  32. if ((options = arguments[i]) !== null) {
  33. for (name in options) {
  34. copy = options[name];
  35. src = target[name];
  36. // 如果是深拷贝,并且为数组或者对象
  37. if (isDeep && (jQuery.isObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {
  38. if (copyIsArray) {
  39. copyIsArray = false;
  40. clone = src && jQuery.isArray(src) ? src : [];
  41. } else {
  42. clone = src && jQuery.isObject(src) ? src : {};
  43. }
  44. target[name] = jQuery.extend(isDeep, clone, copy);
  45. } else {
  46. target[name] = copy; // 浅拷贝
  47. }
  48. }
  49. }
  50. }
  51. return target;
  52. };

实现一个mini-jQuery

源码