摘要:一個(gè)郵箱驗(yàn)證的功能函數(shù)的寫法有幾種簡(jiǎn)單的寫法分析這幾個(gè)函數(shù)可以認(rèn)為是幾個(gè)全局變量,類似于使用場(chǎng)景適用于功能比較單一獨(dú)立的邏輯優(yōu)點(diǎn)寫法用法都比較簡(jiǎn)單缺點(diǎn)此時(shí)的函數(shù)作為全局變量存在,在這種情況多的時(shí)候團(tuán)隊(duì)開發(fā)時(shí)容易被別人的變量覆蓋,而且從業(yè)務(wù)上
1、一個(gè)郵箱驗(yàn)證的功能函數(shù)的寫法有幾種?
(1) 簡(jiǎn)單的寫法
function checkName(){}; function checkEmail(){}; function checkPassword(){};
分析:這幾個(gè)函數(shù)可以認(rèn)為是幾個(gè)全局變量,類似于
var checkName = function(){}; var checkEmail = function(){}; var checkPassword = function(){};
使用場(chǎng)景:適用于功能比較單一、獨(dú)立的邏輯
優(yōu)點(diǎn):寫法、用法都比較簡(jiǎn)單
缺點(diǎn):此時(shí)的函數(shù)作為全局變量存在,在這種情況多的時(shí)候團(tuán)隊(duì)開發(fā)時(shí)容易被別人的變量覆蓋,而且從業(yè)務(wù)上講這幾個(gè)屬于一類函數(shù),所以放在一個(gè)對(duì)象里的話代碼的可讀性大大提高
(2) 作為一個(gè)對(duì)象的一個(gè)屬性的函數(shù)
1、 var CheckoutObject = { checkName: function(){}, checkEmail: function(){}, checkPassword: function(){}, };
類似于
2、var CheckoutObject = function(){}; CheckoutObject.checkName = function(){}; CheckoutObject.checkEmail = function(){}; CheckoutObject.checkPassword = function(){};
使用場(chǎng)景:幾個(gè)功能有一定的邏輯或者類別上的關(guān)系,例如對(duì)表單的增刪改查都屬于對(duì)表單的操作
分析以及優(yōu)點(diǎn):這兩種方式都只有一個(gè)全局變量,極大了削弱了命名沖突的隱患,都能直接通過(guò)變量名稱CheckoutObject直接使用方法,區(qū)別是2屬于函數(shù),在函數(shù)內(nèi)部可以定義所有實(shí)例共有的屬性,更加符合類的特點(diǎn),更加具體的說(shuō)1是2的一種語(yǔ)法糖、只是2的一種實(shí)現(xiàn)方法
缺點(diǎn):1不太符合類的特點(diǎn)不能去實(shí)例化,雖然2可以通過(guò)new去創(chuàng)建對(duì)象但是創(chuàng)建的對(duì)象并不包括那些靜態(tài)方法,對(duì)于函數(shù)變量CheckoutObject復(fù)用性比較差,而且包含屬性并不獨(dú)立
(3) 函數(shù)返回對(duì)象,該對(duì)象包含郵箱校驗(yàn)的方法
var CheckoutObject = function(){ return { checkName: function(){}, checkEmail: function(){}, checkPassword: function(){}, }; }; // 調(diào)用方法 var test = new CheckoutObject(); test.checkName(); test.checkEmail(); test.checkPassword();
使用場(chǎng)景:可以用來(lái)存放一些公共屬性,會(huì)被多人調(diào)用,每次都生成新的實(shí)例
分析:構(gòu)造函數(shù)返回一個(gè)對(duì)象,對(duì)象包含所需的屬性,每次new都是一個(gè)新對(duì)象,對(duì)象包含校驗(yàn)需要的屬性
優(yōu)點(diǎn):每個(gè)實(shí)例對(duì)象所包含的屬性都是獨(dú)立的
缺點(diǎn):test的對(duì)象和CheckoutObject沒什么關(guān)系,通過(guò)instanceof檢測(cè)不出來(lái),
(4) 更具有類特點(diǎn)的對(duì)象
var CheckoutObject = function(){ this.checkName = function(){}; this.checkEmail = function(){}; this.checkPassword = function(){}; }; var test = new CheckoutObject(); console.log(test instanceof CheckoutObject); // true
特點(diǎn):實(shí)例對(duì)象的類型是構(gòu)造函數(shù),這樣更適用于封裝
(5) 對(duì)象間共享的方法
分析:上述創(chuàng)建的對(duì)象都是獨(dú)立的擁有自己的屬性,但是這些屬性是相同的,這樣造成了內(nèi)存的浪費(fèi)
var CheckoutObject = function(){}; CheckoutObject.prototype.checkName = function(){ console.log("我叫小將"); }; var test1 = new CheckoutObject(); var test2 = new CheckoutObject(); test1.checkName(); // 我叫小將 test2.checkName(); // 我叫小將 console.log(test1.checkName === test2.checkName); // true
使用場(chǎng)景:各個(gè)實(shí)例都擁有這個(gè)屬性,這樣就可以提取到原型對(duì)象中,減小內(nèi)存損耗
優(yōu)點(diǎn):原型屬性被所有屬性所共享
缺點(diǎn):實(shí)例的屬性缺乏獨(dú)立性,所以獨(dú)立屬性和共享屬性應(yīng)該對(duì)癥下藥
(6) 更簡(jiǎn)單的鏈?zhǔn)秸{(diào)用
分析:好的代碼應(yīng)該精簡(jiǎn),能占一行絕不占兩行
var CheckoutObject = { checkName: function(){ return this }, checkEmail: function(){ return this } } CheckoutObject.checkName().checkEmail()
共享的也可以
var CheckoutObject = function(){}; CheckoutObject.prototype.checkName = function(){ console.log(this); return this; }; CheckoutObject.checkName()
使用場(chǎng)景:適合一系列操作,例如本博文的校驗(yàn)
優(yōu)點(diǎn):調(diào)用方式簡(jiǎn)潔,易懂
缺點(diǎn):每個(gè)函數(shù)都必須返回當(dāng)前this,也就是this必須指向當(dāng)前執(zhí)行環(huán)境
2、原生對(duì)象(例如Array)添加獨(dú)立的方法為原生對(duì)象添加屬性通常是通過(guò)原型對(duì)象
Array.prototype.remove = function(){};
缺點(diǎn):所有Array都具有了這個(gè)remove屬性造成了污染
優(yōu)點(diǎn):如果大部分實(shí)例都需要這個(gè)方法這就成了優(yōu)點(diǎn)了
Array.prototype.addMethod = function(name, fn){ this[name] = fn; };
這樣所有的Array都具有addMethod這個(gè)屬性,但是具體添加的方法是每個(gè)實(shí)例所共有,具體用那種看實(shí)際使用場(chǎng)景,而且可以在addMethod函數(shù)內(nèi)加一些其它的共享屬性
鏈?zhǔn)教砑雍褪褂?/p>
Function.prototype.addMethod = function(name, fn){ console.log(this === Method); this.prototype[name] = fn; return this; }; var Method = new Function(); Method.addMethod("checkName", function(){ console.log("姓名檢查"); return this; }).addMethod("checkEmail", function(){ console.log("郵箱檢查"); return this; }) var method = new Method(); method.checkName().checkEmail();
使用場(chǎng)景:為原型對(duì)象添加共享方法,但是具體執(zhí)行每個(gè)原型實(shí)例可以自己定義
優(yōu)點(diǎn):提供共享的添加函數(shù),具體添加的函數(shù)每個(gè)Method獨(dú)立,method再次共享
總結(jié):綜上可以看到每種方式都有其使用場(chǎng)景,要對(duì)癥下藥選擇最合適的模式
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/109087.html
摘要:如何從上下載單個(gè)文件夾然后再看了看插件這個(gè)插件能顯示樹狀目錄,還提供了單個(gè)文件的下載。單個(gè)文件本身就提供這個(gè)功能。 瞎扯淡的前言 前幾日遇到一個(gè)比較麻煩的事情,剛好周末有時(shí)間,不知道大家是否和我一樣,在github閱讀源碼的時(shí)候,只想看他的src目錄,當(dāng)然在github上面閱讀非常的麻煩,各種快捷都用不了,函數(shù)跳轉(zhuǎn),全局搜索….等等。但是。。。 關(guān)鍵來(lái)了,很有源碼整個(gè)項(xiàng)目都非常的大,介...
摘要:加上內(nèi)部函數(shù)被返回,被其他對(duì)象引用,形成了閉包,因此對(duì)應(yīng)的變量對(duì)象存在于閉包函數(shù)的作用域鏈中。因此訪問(wèn)次數(shù)越多,費(fèi)用越高,頁(yè)面性能就會(huì)受到很大影響。盡管還主動(dòng)執(zhí)行了一次操作,曲線也沒有下降。 副標(biāo)題:常見的JavaScript內(nèi)存泄露 這是關(guān)于JavaScript內(nèi)存泄露相關(guān)的序列文章中一篇。由于時(shí)間有限更新進(jìn)度會(huì)有點(diǎn)慢,但會(huì)持續(xù)更新的。自己也在學(xué)習(xí)中,難免對(duì)某些知識(shí)點(diǎn)的理解不是很正確...
摘要:開發(fā)流程對(duì)于一個(gè)項(xiàng)目,最大的問(wèn)題就是如何拆解為任務(wù),分配到合適的人手里,并在有限的時(shí)間內(nèi)完成它。但是我們把整個(gè)項(xiàng)目進(jìn)行拆解的話,每個(gè)星期進(jìn)行統(tǒng)計(jì)分析,就可以對(duì)癥下藥,提高開發(fā)效率。 開發(fā)流程 對(duì)于一個(gè)項(xiàng)目,最大的問(wèn)題就是如何拆解為任務(wù),分配到合適的人手里,并在有限的時(shí)間內(nèi)完成它。 就像做建筑工程一樣,其實(shí)做IT也是可以量化的,可能有的人砌磚砌得慢一些,有的人快一些。 但是我們把整個(gè)項(xiàng)目...
摘要:大致步驟如下監(jiān)聽滾動(dòng)事件,計(jì)算目標(biāo)元素距離視口的距離。距離滿足條件時(shí),創(chuàng)建占位元素,修改目標(biāo)元素定位方式為。僅僅為了實(shí)現(xiàn)這個(gè)效果頁(yè)面上沒有其他內(nèi)容大動(dòng)干戈性價(jià)比很低。對(duì)癥下藥,讓滾動(dòng)發(fā)生在被誤匹配上的祖先元素內(nèi)即可恢復(fù)。為什么要寫這篇文章 Sticky 也不是新知識(shí)點(diǎn)了,寫這篇文章的原因是由于最近在實(shí)現(xiàn)效果的過(guò)程中,發(fā)現(xiàn)我對(duì) Sticky 的理解有偏差,代碼執(zhí)行結(jié)果不如預(yù)期。決定寫篇文章重新...
閱讀 2119·2021-11-23 09:51
閱讀 2282·2021-09-29 09:34
閱讀 3768·2021-09-22 15:50
閱讀 3614·2021-09-22 15:23
閱讀 2720·2019-08-30 15:55
閱讀 761·2019-08-30 15:53
閱讀 3146·2019-08-29 17:09
閱讀 2698·2019-08-29 13:57