JavaScript插件化開發教學 (二)_javascript技巧
一,開頭分析
Hi,大家好!還記得前面的文章嗎------這個系列的開頭(JavaScript插件化開發教學一)。主要講述了以“jQuery的方式如何開發插件”,
那麼今天我們帶著昨天的疑問來繼續我們的插件開發之旅。之前的問題如下:
(1),如果專案技術選型換了這些插件又是強依賴「jQuery」機制,我們以前寫的插件將會不能用(假設不用jQuery的情況),如何做重構那?
(2),重構插件的關鍵邏輯,我們將如何組織那?
好了,帶著問題去學習今天的文章吧。
首先我不是否定“jQuery插件的方式”,其次是我們要從不同的角度分析問題,比如說“jQuery插件有以下優點”:
(1),把全部程式碼放在閉包(一個即時執行函數)裡此時閉包相當於一個私有作用域,外部無法存取到內部的信息,並且不會存在全域變數的污染情況。
(2),a) 避免全域依賴;b) 避免第三方破壞;c) 相容於jQuery運算元'$'和'jQuery '。
那我們重構將以什麼方式組織程式碼那,是物件導向的思想(OOP)那?還是過程化的思路進行到底那?還是兩者結合設計那?哈哈哈,繼續看下去。 。 。 。 。 。
二,重構昨天的例子
以下是昨天的Js部分原始碼部分:
(function($){
$.fn.bigbear = function(opts){
opts = $.extend({},$.fn.bigbear.defaults,opts) ;
return this.each(function(){
var elem = $(this) ;
elem.find("span").text(opts["title"]) ;
$.get(opts["url"],function(data){
elem.find("div").text(data["text"]) ;
}) ;
}) ;
} ;
$.fn.bigbear.defaults = {
title : "這是一個簡單的測試" ,
url : "data.json"
} ;
})(jQuery) ;
我們來逐行分析一下:
先確定這個插件的功能
(1),顯示我們設定的標題文字資訊。
(2),動態透過非同步的方式取得內容資訊。
好了!需求明確就好展開討論了,從上面的程式碼不難看出邏輯組織很鬆散,過程化的思維很明顯,所以第一步就是把我們的功能需求
以類別的方式有效地組織起來。看如下重構後的程式碼:
$(函數(){
$("#bb").bigbear() ;
}) ;
(函數($){
$.fn.bigbear = 函數(opts){
opts = $.extend({},$.fn.bigbear.defaults,opts) ;
回 this.each(function(){
var elem = $(this) ;
var bb = new BigBear(elem,opts) ;
bb.getElem().trigger("data") ;
}) ;
} ;
$.fn.bigbear.defaults = {
title : "這是一個簡單的測試" ,
url : "data.json"
} ;
})(jQuery) ;
函數 BigBear(elem,opts){
this.elem = elem ;
this.opts = opts ;
this.init() ;
} ;
var bbProto = BigBear.prototype ;
bbProto.getElem = function(){
返回 this.elem ;
} ;
bbProto.getOpts = function(){
返回 this.opts ;
} ;
bbProto.init = function(){
var that = this ;
this.getElem().on("data",function(){
that._setTitle(that.getOpts()["標題"]) ;
$.get(that.getOpts()["url"],function(結果){
that.getElem().find("div").text(result["text"]) ;
}) ;
}) ;
} ;
bbProto._setTitle = 函數(文本){
this.getElem().find("span").text(text) ;
} ;
呵呵,是不是程式碼多精彩,其實這種方式就是針對物件的角度看問題,先去分析功能需求,然後設計我們的類,雖然說我們不可能一下設計得非常出色,
但是看問題角度改變了,我們的程式碼競爭力變強了,以及更好地進行這樣我們的目的就達到了。
以下是摘自「Bootstrap」Js部分的相關源碼實現,如下圖:
不難看出類似的實作方式,透過類別來維護我們插件的主要邏輯。
(三),增加新功能,引出額外的類別
現在需求增加了,需要在體驗上感受到變化,載入資料時有「正在載入」效果。
實作思路可以這樣,在原始的內容區把文字設定成「裝載資料中。。。」的字樣,然後引入一個新的類,如下:
函數疊加(){
} ;
var olProto = Overlay.prototype ;
olProto.show = function(){} ;
olProto.hide = function(){} ;
// 具體實作還沒寫完
好了,遮罩層已經有了,現在我們要怎麼整合進來?我們用組合的方式接入接入,如下:
函數 BigBear(elem,opts){
this.elem = elem ;
this.opts = opts ;
this.overlay = new Overlay() ;
this.init() ;
} ;
var bbProto = BigBear.prototype ;
bbProto.getElem = function(){
返回 this.elem ;
} ;
bbProto.getOpts = function(){
返回 this.opts ;
} ;
bbProto.init = function(){
var that = this ;
var loadText = "資料裝載量。。" ;
this.getElem().on("data",function(){
that._setTitle(that.getOpts()["標題"]) ;
that.overlay.show() ;
that.getElem().find("div").text(loadingText) ;
$.get(that.getOpts()["url"],function(結果){
that.overlay.hide() ;
that.getElem().find("div").text(result["text"]) ;
}) ;
}) ;
} ;
bbProto._setTitle = 函數(文本){
this.getElem().find("span").text(text) ;
} ;
這只是為了我們的功能已經結束了,這樣寫的插件,我相信比第一個版本好很多,當然這不是最規範的實現,需要從細節上重構不斷,但這種方式是一種可選的開發外掛的方式。
以下是完整程式碼:
$("#bb").bigbear() ;
}) ;
(函數($){
$.fn.bigbear = 函數(opts){
opts = $.extend({},$.fn.bigbear.defaults,opts) ;
返回 this.each(function(){
var elem = $(this) ;
var bb = new BigBear(elem,opts) ;
bb.getElem().trigger("data") ;
}) ;
} ;
$.fn.bigbear.defaults = {
title : "這是一個簡單的測試" ,
url : "data.json"
} ;
})(jQuery) ;
函數 BigBear(elem,opts){
this.elem = elem ;
this.opts = opts ;
this.overlay = new Overlay() ;
this.init() ;
} ;
var bbProto = BigBear.prototype ;
bbProto.getElem = function(){
返回 this.elem ;
} ;
bbProto.getOpts = function(){
返回 this.opts ;
} ;
bbProto.init = function(){
var that = this ;
var loadText = "資料裝載量。。" ;
this.getElem().on("data",function(){
that._setTitle(that.getOpts()["標題"]) ;
that.overlay.show() ;
that.getElem().find("div").text(loadingText) ;
$.get(that.getOpts()["url"],function(結果){
that.overlay.hide() ;
that.getElem().find("div").text(result["text"]) ;
}) ;
}) ;
} ;
bbProto._setTitle = 函數(文本){
this.getElem().find("span").text(text) ;
} ;
函數最大值(){
} ;
var olProto = Overlay.prototype ;
olProto.show = function(){} ;
olProto.hide = function(){} ;
// 具體實作還沒寫完

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

這個AI輔助程式工具在這個AI快速發展的階段,挖掘出了一大批好用的AI輔助程式工具。 AI輔助程式設計工具能夠提升開發效率、提升程式碼品質、降低bug率,是現代軟體開發過程中的重要助手。今天大姚給大家分享4款AI輔助程式工具(而且都支援C#語言),希望對大家有幫助。 https://github.com/YSGStudyHards/DotNetGuide1.GitHubCopilotGitHubCopilot是一款AI編碼助手,可幫助你更快、更省力地編寫程式碼,從而將更多精力集中在問題解決和協作上。 Git

2022年3月3日,距離世界首個AI程式設計師Devin誕生不足一個月,普林斯頓大學的NLP團隊開發了一個開源AI程式設計師SWE-agent。它利用GPT-4模型在GitHub儲存庫中自動解決問題。 SWE-agent在SWE-bench測試集上的表現與Devin相似,平均耗時93秒,解決了12.29%的問題。 SWE-agent透過與專用終端交互,可以開啟、搜尋文件內容,使用自動語法檢查、編輯特定行,以及編寫和執行測試。 (註:以上內容為原始內容微調,但保留了原文中的關鍵訊息,未超過指定字數限制。)SWE-A

Go語言開發行動應用程式教學隨著行動應用程式市場的不斷蓬勃發展,越來越多的開發者開始探索如何利用Go語言開發行動應用程式。作為一種簡潔高效的程式語言,Go語言在行動應用開發中也展現了強大的潛力。本文將詳細介紹如何利用Go語言開發行動應用程序,並附上具體的程式碼範例,幫助讀者快速入門並開始開發自己的行動應用程式。一、準備工作在開始之前,我們需要準備好開發環境和工具。首

五大熱門Go語言庫總結:開發必備利器,需要具體程式碼範例Go語言自從誕生以來,受到了廣泛的關注和應用。作為一門新興的高效、簡潔的程式語言,Go的快速發展離不開豐富的開源程式庫的支援。本文將介紹五大熱門的Go語言庫,這些庫在Go開發中扮演了至關重要的角色,為開發者提供了強大的功能和便利的開發體驗。同時,為了更好地理解這些庫的用途和功能,我們會結合具體的程式碼範例進行講

Android開發是一項繁忙而又令人興奮的工作,而選擇適合的Linux發行版來進行開發則顯得尤為重要。在眾多的Linux發行版中,究竟哪一個最適合Android開發呢?本文將從幾個方面來探討這個問題,並給出具體的程式碼範例。首先,我們來看看目前流行的幾個Linux發行版:Ubuntu、Fedora、Debian、CentOS等,它們都有各自的優點和特點。

Go語言作為一種快速、高效的程式語言,在後端開發領域廣受歡迎。然而,很少有人將Go語言與前端開發聯繫起來。事實上,使用Go語言進行前端開發不僅可以提高效率,還能為開發者帶來全新的視野。本文將探討使用Go語言進行前端開發的可能性,並提供具體的程式碼範例,幫助讀者更了解這一領域。在傳統的前端開發中,通常會使用JavaScript、HTML和CSS來建立使用者介面

《了解VSCode:這款工具到底是用來做什麼的? 》身為程式設計師,無論是初學者或資深開發者,都離不開程式碼編輯工具的使用。在眾多編輯工具中,VisualStudioCode(簡稱VSCode)作為一款開源、輕量級、強大的程式碼編輯器備受開發者歡迎。那麼,VSCode到底是用來做什麼的呢?本文將深入探討VSCode的功能和用途,並提供具體的程式碼範例,以幫助讀者

PHP在Web開發中是屬於後端。 PHP是一種伺服器端腳本語言,主要用於處理伺服器端的邏輯,產生動態網頁內容。與前端技術相比,PHP更多地用於與資料庫互動、處理使用者請求以及生成頁面內容等後端操作。接下來透過具體的程式碼範例來說明PHP在後端開發中的應用。首先,我們來看一個簡單的PHP程式碼範例,用於連接資料庫並查詢資料:
