实现一个 jQuery 的API

上图,看最终结果:

// 实现一个 jQuery 的API

window.jQuery = function(_x){
  let e;
  if(typeof _x === "string"){
    e = document.querySelectorAll(_x);
  }else{
    e = _x;
  }
  return {
    addClass: function(_classStr){
      for(let i=0; i<e.length;i++){
        e[i].classList.add(_classStr);
      }
    },
    setText: function(_textStr){
      for(let i=0; i<e.length;i++){
        e[i].textContent = _textStr;
      }
    }
  }
}
window.$ = jQuery

var $div = $('div')

$div.addClass('red') // 可将所有 div 的 class 添加一个 red
$div.setText('hi') // 可将所有 div 的 textContent 变为 hi

过程中一些细节:

第一部分:

开启一个独立的命名空间,window.jQuery = {},可改写成window.jQuery = function(){ return {};}

第二部分:

window.jQuery返回的是一个对象,对象里边存在一些可以操作的方法 .addClass() .setText()

return {
  addClass: function(){},
  setText: function(){}
}

需要注意的是对象里边存在着遍历操作。

第三部分

window.$ = jQuery 是什么鬼?
那就翻译一下吧,看这里 >>> window.$ = window.jQuery
其实就是简单的赋值(引用),为了更方便的使用这个 jQuery 。但是有一种习俗(约定成俗的规则),jQuery的变量前面要加 $ 前缀。防止以后犯晕不知道那个是原生的DOM,那个是jQuery的。

第四部分(最后一点)

细心的你可能会发现,window.jQuery中产生一个闭包了。 对就是产生一个闭包(闭包 = 环境因子 + 操作因子)。

  • 环境因子: 变量 e
  • 操作因子: addClass() setText()
其实这些东西在实际的 jQuery 函数库中是就是这样的(不过他们实现的更高级一些),思路基本都相通的。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、需求:构造一个名叫“ jQuery” 的 库,含有API:1.addClass():给所选元素添加一个clas...
    Zoey_h阅读 2,669评论 0 0
  • 1.通过在window.jQuery上添加一个函数声明命名空间,从而防止全局变量的产生。 考虑到用户可能传入的是一...
    钢笔与橡皮阅读 1,371评论 0 0
  • get和set放到了nodes.text里面,通过判断text是否为undefined去实现功能。 若要addCl...
    毛毛独角兽阅读 1,690评论 0 0
  • jQuery 实质上是一个构造函数,接受一个参数(这个参数可能是节点)并返回一个方法去操作这个节点。
    梅林1993阅读 1,488评论 0 0
  • 在这里我们将实现两个功能,给一个div元素,添加多个classname,并把div元素的内容全部输出为‘hi’ 首...
    charllote8阅读 1,573评论 0 1