1 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
關(guān)于“構(gòu)造函數(shù)+對(duì)象”,你其實(shí)缺的是有關(guān)“類”的知識(shí),關(guān)于這個(gè),我在求問js 中的類究竟是什么意思?已經(jīng)答過,自己閱讀吧
補(bǔ)充:
如果你懂“類”是什么,那這個(gè)問題本來就不應(yīng)該存在了。秉承好人做到底的原則,還是簡單說兩句吧。
雖然無論函數(shù),還是類都講求單一職責(zé),但顯然力度不同。當(dāng)我們使用函數(shù)時(shí),通常希望這個(gè)函數(shù)是“單純的”,即:不依賴上下文,譬如:
var sum = function(x, y){ return x + y; };
這個(gè)函數(shù)只要我輸入的參數(shù)是
2, 3
,返回值永遠(yuǎn)都是5
。可測(cè)試、可預(yù)料。簡單直接(當(dāng)然函數(shù)也可以完成先對(duì)復(fù)雜的工作,這個(gè)就看寫作人對(duì)需求的認(rèn)識(shí)、對(duì)代碼的理解了)
而當(dāng)面對(duì)“類”時(shí),她是完全“不單純”的,即:“類”就是創(chuàng)造了一個(gè)上下文,供各個(gè)實(shí)例對(duì)象使用;為什么要提供上下文,是因?yàn)椤邦悺碧峁┑氖且幌盗邢嚓P(guān)行為,單一職責(zé)在這里顯然力度更廣,為什么是一系列行為,這其實(shí)就是人們常說的“高內(nèi)聚”。打個(gè)比方,我現(xiàn)在寫一個(gè)動(dòng)物類:
class Animal { constructor(type){ this.type = type; } movo(){ console.log(`I am ${this.type}, i can run`); } }var cat = new Animal('cat');var dog = new Animal('dog'); cat.move();//I am cat, i can rundog.move();//I am dog, i can run
兩個(gè)不同的類,
cat
和dog
,都調(diào)用了move
方法,參數(shù)都沒有傳,但顯然輸出內(nèi)容不一樣了,因?yàn)檫@里依賴了上下文this.type
。但這樣一個(gè)“動(dòng)物”的使用場(chǎng)景,如果改用函數(shù),怎么描述一個(gè)“貓”更合適?顯然比較困難
再次補(bǔ)充:
最后再談幾句關(guān)于模塊的事情,模塊通常用來組織代碼,和函數(shù)、類是不同緯度的工具,舉個(gè)例子:
在java 9
中,模塊類似命名空間,可以把若干有邏輯關(guān)聯(lián)的類歸在同一個(gè)模塊下,方便他人使用(這里的方便他人使用,就是“組織”相關(guān)的工作)。
又或者,在javascript
中,模塊可以是一個(gè)函數(shù)(例如之前很火的left-pad),也可以是一個(gè)類(比如:bl)甚至可以是一大堆函數(shù)和類的集合(比如:express)。完全取決于你希望你的代碼怎么樣被組織、使用
添加回答
舉報(bào)