模拟jQuery实现原理

jQuery实质上就是一个构造函数,接受一个参数,这个参数可能是节点,然后返回一个方法对象是操作节点。

大概模拟下jQuery实现原理。

细节注释如下:

window.jQuery = function (nodeOrSelector) {  // 参数可能是node,也可能是选择器
  let nodes = {}  // 先声明一个空对象,伪数组
  if (typeof nodeOrSelector === 'string') {  // 字符串检测,如果是个字符串或多个字符串
    let temp = document.querySelectorAll(nodeOrSelector)  // 找一个节点或多个节点,temp是伪数组,不想要nodelist的原型
    for (let i = 0; i < temp.length; i++) {  // 遍历这个temp
      nodes[i] = temp[i]
    }
    nodes.length = temp.length  // 生成新的纯净的伪数组,有纯净的原型链
  } else if (nodeOrSelector instanceof Node) {  // 如果传的是一个节点
    nodes = {   // 前一种情况返回伪数组,另外一种情况也应该返回伪数组,不会被弄晕
      0: nodeOrSelector,
      length: 1
    }
  }

  nodes.addClass = function (classes) {
    [classes].forEach((value) => {  // 有可能每个节点上要加不止一个class(classes可能是个伪数组),所以需要foreach()方法,对classes里每个值执行函数
      for (let i = 0; i < nodes.length; i++) {  // 要加多个元素节点的class,所以需要遍历,根据nodes的个数
        nodes[i].classList.add(value)   // 对每个遍历到的nodes的值addclass(根据classes里value个数,因为foreach方法,这个for循环要轮几大轮)
      }
    })
  }

  nodes.setText = function (text) {
    for (let i = 0; i < nodes.length; i++) {  // 利用for循环遍历nodes
      nodes[i].textContent = text   // nodes里每个value的textcontent都等于text
    }
  }
  return nodes  // 返回nodes
}
window.$ = jQuery

var $div = $('div')
$div.addClass('blue') // 可将所有 div 的 class 添加一个 blue
$div.setText('hi') // 可将所有 div 的 textContent 变为 hi
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,964评论 1 45
  • 正确本身的价值 一、世界上排名第二的痛苦 证明自己是正确的。 二、事实上 正确本身,其实很可能并没有什么价值。 三...
    青青wh阅读 1,397评论 0 0
  • 深蹲,力量训练之王。深蹲的动作意义和训练要点我们介绍过不少,比如“完美深蹲的五个细节”,比如“深蹲,如何正确的下蹲...
    硬派健身阅读 6,664评论 2 12