学习 jquery 源码的思想-手写简单jquery

157 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

26-手写实现一个 jquery 学习 jquery 源码的思想, 提升自身编程思维

手写实现一个 jquery 分析

现代技术的发展飞快, jquery 已正在逐渐淡化, 公司实际项目开发也越发向各大框架靠拢, 但是jquery的编程思想却是不过时有可学之处的!

学习 jquery 源码的编程思想

手写代码实现

// 传 window 是为了优化,减少作用域链查找, 不传就会向上查找,浪费

// js 特性-作用域链

;(function (window) {
  // amd. cmd 模块规则
  function jquery() {
    // return new jquery(); // 这种方法就无限递归循环了,,,
    return new jquery.fn.init()
  }
  // 利用我们的js引用类型的特点:
  jquery.fn.init.prototype = jquery.fn // 把他们的对象都共享起来, 同时改变
  jquery.fn = jquery.prototype = {
    init: function () {},
  }
  // 我们怎么扩展方法? // 如下 耦合性太高, 不易维护
  // jquery.fn.init.prototype = function css() { }

  // jQuery 操作: 模块, 方便修改
  // $.extend({a: 1});
  // $.extend({a: 2}, {c: 2}); return {a: 2, c: 2}
  jquery.extend = jquery.fn.extend = function () {
    // 设计模式
    // let arg1 = arguments[0]
    // let arg2 = arguments[1]
    // // ??? 如下重复for
    // if (arguments.length > 1) {
    //   for (var item in arg2) {
    //     arg1[item] = arg2[item]
    //   }
    // } else {
    //   for (var item in arg1) {
    //     this[item] = argq[item]
    //   }
    // }
    // 享元模式-减少类似对象的数量
    var target = arguments[0] || {}
    var length = arguments.length
    var i = 1
    var options
    if (target !== 'object') {
      target = {}
    }
    if (length === 1) {
      target = this
      i--
    }
    for (; i < length; i++) {
      if ((options = arguments[i]) != null) {
        for (var name in options) {
          target[name] = options[name]
        }
      }
    }
  }
  jquery.fn.extend({
    // css 模块
  })
  jquery.fn.extend({
    // 动画模块
  })

  if (typeof define === 'function' && define.amd && define.amd.jQuery) {
    define('jQuery', [], function () {
      return jQuery
    })
  }
  window.$ = window.jquery = jquery
})(window)