自定義一個(gè)API

jQuery 是 JavaScript 中使用非常廣泛的庫,究其原因的話,一方面是它確實(shí)方便,另一方面是對于程序員來說,瀏覽器提供的 API 太垃圾了 ……
比如,瀏覽器沒有提供獲取同級兄弟節(jié)點(diǎn)的API,也沒有同時(shí)給多個(gè)節(jié)點(diǎn)輸入內(nèi)容的 API。
今天,我們來模擬一下 jQuery 的原理,給自己定義一些瀏覽器“欠缺”的 API。

jQuery 是什么形式呢?

jQuery(a).addClass();

它會(huì)先選擇,然后就可以調(diào)用 jQuery 的各種 API 來操作這些被選擇的對象了。

于是,首先,我們生成一個(gè) local 作用域來存放我們將要設(shè)計(jì)的各種 API,這樣我們完全不用顧慮會(huì)影響到全局變量。

let myDomWithApi = function () {
  let nodes = {};
  return nodes;
}

上面的代碼中,我們創(chuàng)建了一個(gè)函數(shù),最終返回一個(gè)對象,我們希望我們想要處理的節(jié)點(diǎn)對象以及自定義的 API 就存在于這個(gè)對象中。
于是,我們開始選擇:

let myDomWithApi = function(nodeOrSelector) {
  let nodes = {};
  let temp = document.querySelectorAll(nodeOrSelector); //用原生 API 獲取節(jié)點(diǎn)
  if (typeof nodeOrSelector === "string") {
    for (let i = 0; i < temp.length; i++) {
      nodes[i] = temp[i];
    };
    nodes.length = temp.length;
  } else {
    nodes = {
      //如果輸入是 node,直接拿來用;
      0: nodeOrSelector,
      length: 1
    };
  };
  return nodes;
}

在接下來,我們就可以開始定義自己的 API 了:


let myDomWithApi = function (nodeOrSelector) {
  let nodes = {};

  // 省略;

  // 比如,我們想同時(shí)給所有已選擇的節(jié)點(diǎn)加上 class ...
  nodes.addClass = function(value) {
    for (let i = 0; i < nodes.length; i++){
      nodes[i].classList.add(value);
    };
  };

  // 同時(shí)修改所有已選節(jié)點(diǎn)的文本:
  nodes.setText = function(text) {
    for (let i = 0; i < nodes.length; i++ ) {
      nodes[i].innerHTML = text;
    };
  };

  // 我們想要找一個(gè)節(jié)點(diǎn)的同級兄弟:
  nodes.getSiblings = function (node) {
    let allChildren = node.parentNode.children;
    let array = {length: 0};
    for (let i = 0; i < allChildren.length; i++) {
      if (allChildren[i] !== node){
        // 把除了自己以外的節(jié)點(diǎn)加到新的對象中;
        array[array.length] = allChildren[i];
        array.length++;
      };
    };
    return array;
  };
  return nodes;
}

完成!這樣我們就可以快樂地使用自己的 API 了:

let div = myDomWithApi("div");
div.addClass = "xxx" // Work!

//如果,我們把原來的函數(shù)名改為:myDomWithApi → jQuery
//那么就可以生成一個(gè)很像 jQuery 的東西了

let jQuery = ……
jQuery("div").addClass = "xxx"

//如果再設(shè)置個(gè)$,那就更像了 ……

window.$ = jQuery;
$("div").addClass = "xxx" // 一樣效果!

在寫上一篇文章的時(shí)候,我還不太清楚閉包的作用,不過,今天就碰上了,這就是閉包,內(nèi)層作用域的變量與外層鏈接了。

window.nodes // → Uncaught ReferenceError: nodes is not defined
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 28,858評論 1 45
  • 前端開發(fā)面試題 面試題目: 根據(jù)你的等級和職位的變化,入門級到專家級,廣度和深度都會(huì)有所增加。 題目類型: 理論知...
    怡寶丶閱讀 2,692評論 0 7
  • 請參看我github中的wiki,不定期更新。https://github.com/ivonzhang/Front...
    zhangivon閱讀 7,778評論 2 19
  • 前端開發(fā)知識(shí)點(diǎn) HTML&CSS對Web標(biāo)準(zhǔn)的理解、瀏覽器內(nèi)核差異、兼容性、hack、CSS基本功:布局、盒子模型...
    Hebborn_hb閱讀 896評論 0 1
  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,536評論 0 21

友情鏈接更多精彩內(nèi)容