一些很棒的js代碼(持續跟新)

来源:http://www.cnblogs.com/chuaWeb/archive/2016/03/21/5302859.html
-Advertisement-
Play Games

1.jQuery初始化代碼段 技術亮點:jQuery無new化構建、每次jQuery構建的作用域隔離、jQuery拓展插件。 實現源碼: 分析: 每次jQuery函數內部new的作用是隔離作用域。每次構建的都是一個新對象,新對象obj如果重寫obj.__proto__下的屬性不影響其他jQuery對


1.jQuery初始化代碼段

  技術亮點:jQuery無new化構建、每次jQuery構建的作用域隔離、jQuery拓展插件。

  實現源碼:

var jQuery = function(args){
  return new jQuery.fn.init(args);
}
jQuery.fn = jQuery.prototype = {
  init: function(args){
    return this;
  },
  otherFn: function(){}
}
jQuery.fn.init.prototype = jQuery.fn;

  分析:

  每次jQuery函數內部new的作用是隔離作用域。每次構建的都是一個新對象,新對象obj如果重寫obj.__proto__下的屬性不影響其他jQuery對象__proto__下的屬性。

var m = jQuery(),n= jQuery();//m = {__proto__:{init:fn(),otherFn:fn()}};n = {__proto__:{init:fn(),otherFn:fn()}}
m.otherFn;//fn(){}
m.otherFn = "test";//m =  {otherFn:"test",__proto__:{init:fn(),otherFn:fn()}};
n.otherFn;//fn(){}; n的結構n = {__proto__:{init:fn(),otherFn:fn()}}

  然後jQuery.fn提供jQuery對象的拓展,只要使用jQuery.fn.xx定義的屬性在通過var m = jQuery();方式獲取的對象m都可以通過m.xx獲取到。如果直接使用jQuery.prototype來提供拓展給人感覺不太友好。

  上面的代碼換成下麵這種寫法也是可以的

var jQuery = function(args){
  return new jq(args);
}
function jq(args){
    return this;
}
jQuery.fn = jq.prototype = {
  otherFn: function(){};
}

  多出了一個函數變數jq,jQuery的這種寫法只是減少了變數而已。

  關於new的詳細點擊這裡

 

2.Sizzle引擎詞法緩存機制

  技術亮點:一個函數實現存、取、緩存數據。

  實現源碼:

function createCache() {
  var cache, keys = [];
  return (cache = function( key, value ) {
    // 使用 (key + " ")避免命名衝突,最大緩存createCache.cacheLength:50
    if ( keys.push( key += " " ) > createCache.cacheLength ) {
      // 去掉最老的記錄
      delete cache[ keys.shift() ];
    }
    return (cache[ key ] = value);
  });
}
createCache.cacheLength  = 50;


//例子
var tokenCache = createCache(); //設置緩存 tokenCache("name", "chua"); //tokenize函數中獲取緩存 cached = tokenCache[ "name" + " " ];//"chua"

  分析:

  局部變數cache使用函數表達式方式賦值,cache函數中給cache這個函數對象添加要緩存的屬性。可以說是把函數對象運用到了極致。

 

3.jQuery判斷js數據的具體類型

  技術亮點:call的妙用

  實現源碼:

var class2type = {} ,
core_toString = class2type.toString; 
jQuery.type = function( obj ) {
  if ( obj == null ) {
    return String( obj );
  }
  return typeof obj === "object" || typeof obj === "function" ?
  class2type[ core_toString.call(obj) ] || "object" :
  typeof obj;
}
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
  class2type[ "[object " + name + "]" ] = name.toLowerCase();
});

   分析:

  首先我們知道toString()函數用於將當前對象以字元串的形式返回。該方法屬於Object對象,由於所有的對象都"繼承"了Object的對象實例,因此幾乎所有的實例對象都可以使用該方法。而Object調用toString方法返回"[object ObjectName]",其中ObjectName是對象類型的名稱。然後jQuery利用這一特性將準備檢測的數據代入object的toString方法替換掉了其上下文環境為要檢測的數據。

 

4.Dean Edwards的base2格式化函數

  技術亮點:arguments的靈活運用

  實現源碼:

function format(string) {
  var args = arguments;
  var pattern = new RegExp('%([1-' + arguments.length + '])', 'g');
  return String(string).replace(pattern, function(match, index,position,all) {  
    console.log(match + ' ' + index + ' ' + position + ' ' + all);
    return args[index];  
  });  
};

//實例
var name = "chua",
age = 20,
expr = "%1的年齡是%2";
format(expr,name,age);//"chua的年齡是20"
//控制台列印
//%1 1 0 %1的年齡是%2
//%2 2 6 %1的年齡是%2

  分析:這個比較簡單就不分析了。主要就是arguments.length的運用。

   

  今天先到這裡,明天繼續。。。

 

  如果覺得本文不錯,請點擊右下方【推薦】!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這幾天剛掌握的內部插入,做了個簡易的選課系統分享下 <body> <h1>系統選課</h1> <div id="da"> <div id="div1"> 可選課程 </div> <div id="div2"> </div> <div id="div3"> 已選課程 </div> </div> <di
  • 一、類選擇器:"."類選擇器{css樣式代碼} 1、使用合適標簽吧要修飾的內容標記下來。 <span>內容</span> 2、<span class=“stress”>內容</span> 3、.stress{color:red} 註意:英文圓點開頭,類選擇器可任意名稱但不要中文。 二、ID選擇器 1
  • 筆者是前端小白一枚,在往前端頁面重構方向學習成長中,今天花了一天時間學習相關的文章 在這裡集合一些關於重構基礎概念和成長建議,希望能對想瞭解和學習頁面重構的同學有所幫助 文章中提到的相關文章均說明鏈接地址,利於說明文章來源,也方便讀者深入探討 抱著學習的態度看這些文章,我也希望能夠在文章中加入自己學
  • <!doctype html><html lang="en"> <head> <meta charset="UTF-8"> <title>ajax()</title> <script src="js/jquery-1.6.js"></script> <script> $(function(){ $(
  • // 重新定位所有消息提示層(當使用dipslay顯示隱藏某些HTML層時,由於消息是絕對定位的,所以會出現消息層錯位現象) //在最後調用此方法重新定位即可 function resetPos(){ var objs = document.getElementsByTagName('*'); va
  • 使用方法: 粘貼代碼到文本文檔中,文檔名稱為datetime.js,然後在html文件中引用如下代碼即可 <input name="shijian1" id="shijian1" type="text" class="sang_Calender" /> <script type="text/java
  • 記錄下vue開發過程中的一些理解,如有不足,希望大家多多提意見。 vue裡面的數據綁定,是一種常見的元素操作,如v-bind:src,v-bind:class,v-bind:style等等。 這是個官網的例子,再舉一個常見的。我們一般對網頁圖片優化,需要考慮對圖片懶載入(延遲載入)會寫如下代碼: 1
  • 調用 下載地址:http://www.zhangxinxu.com/study/down/jquery_jcrop_zh.zip crop_rotation/zxx.crop_rotation.js excanvas.js
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...