摘要:看著別人寫(xiě)的功能對(duì),就直接拿過(guò)來(lái)用,寫(xiě)出來(lái)的代碼臃腫到爆炸,滿(mǎn)屏幕的的初級(jí)使用方式,運(yùn)氣好了能湊合跑起來(lái),出了問(wèn)題全臉懵逼,心中安慰自己一萬(wàn)遍我可是干設(shè)計(jì)的,但是既然打算好好整下就得從頭開(kāi)始看了。
溫馨提示:作者的爬坑記錄,對(duì)你等大神完全沒(méi)有價(jià)值,別在我這浪費(fèi)生命
首先,說(shuō)實(shí)話,我對(duì)不起javascript,作為一個(gè)接觸前端快10年的老前端(偽),一直發(fā)揚(yáng)的是不求甚解的拿來(lái)就用主義。
看著別人寫(xiě)的功能對(duì),就直接拿過(guò)來(lái)用,寫(xiě)出來(lái)的代碼臃腫到爆炸,滿(mǎn)屏幕的jquery的初級(jí)使用方式,運(yùn)氣好了能湊合跑起來(lái),出了問(wèn)題全臉懵逼,心中安慰自己一萬(wàn)遍我可是干設(shè)計(jì)的,但是既然打算好好整下js就得從頭開(kāi)始看了。
希望能夠從源頭制止一些錯(cuò)誤的發(fā)生
既然從頭來(lái),那我就來(lái)重新審視一下面相對(duì)象程序基礎(chǔ)的基礎(chǔ):創(chuàng)建對(duì)象
于是又看了成噸博文
JavaScript中的對(duì)象,如何創(chuàng)建對(duì)象,創(chuàng)建對(duì)象的7種模式 - 旗smile
JS中創(chuàng)建對(duì)象的幾種常用方法 - ifcode
ECMAScript 定義類(lèi)或?qū)ο?- w3school(深度好文,強(qiáng)烈推薦)
沒(méi)有對(duì)象,自己造一個(gè)不就好了 --某資深黑魔法師前輩程序員
這是最簡(jiǎn)單的創(chuàng)造對(duì)象的方式,簡(jiǎn)單到只有一句話
var girlFriend = {};
搓搓手,下一步我們給她添加些屬性和方法,讓她看上去更真實(shí)(有意義)
girlFriend.name = "REI"; girlFriend.moeType = "silent"; girlFriend.hairColor = "blue"; girlFriend.sayHello = function(){ return "..." }
我們也可以用一種更直接可讀性更強(qiáng)的方式來(lái)創(chuàng)建
var girlFriend = { name : "REI", moeType : "silent", hairColor : "blue", sayHello : function(){ return "..." } }
至此一個(gè)相對(duì)完整的對(duì)象就創(chuàng)建出來(lái)了,我們可以隨意的查看她的內(nèi)部屬性調(diào)用其內(nèi)部方法
console.log(girlFriend.name)//REI console.log(girlFriend.sayHello)//...
這種方式的優(yōu)點(diǎn)在于簡(jiǎn)單直接,便于理解,缺點(diǎn)在于只能創(chuàng)建單個(gè)對(duì)象(你還想怎樣),往往在我們的應(yīng)用/后宮中,需要?jiǎng)?chuàng)造多個(gè)實(shí)例對(duì)象,這也就是面向?qū)ο螅髮m漫的意義不是嗎
我對(duì)象批量生成的對(duì)于上面那個(gè)危險(xiǎn)的想法,我們的思路是如果生成對(duì)象,能像執(zhí)行函數(shù)那樣,傳入不同的參數(shù)自動(dòng)生成不通的實(shí)例對(duì)象,哪豈不是十分方便,而事實(shí)上我們也是這么做的
最簡(jiǎn)單的想法,就是將我們上面的方法封裝成一個(gè)函數(shù)
function GirlFriend(name,moeType,hairColor){ var girlFriend = {}; girlFriend.name = name; girlFriend.moeType = moeType; girlFriend.hairColor = hairColor; girlFriend.sayHello = function(){ return moeType == "silent"?"..." : "Ohayo!" } return girlFriend; } var rei = GirlFriend("Rei","silent","blue"); var asuka = GirlFriend("Atsuka","genki","red"); console.log(rei.sayHello());//... console.log(asuka.sayHello());//Ohayo!
結(jié)果如果我們所見(jiàn),我們創(chuàng)建了兩個(gè)不同的對(duì)象實(shí)體,她們有著相同的屬性名稱(chēng)但是確有不同的屬性值,這就是坊間所說(shuō)的工廠模式
回頭想想雖然我們成功的創(chuàng)建了兩個(gè)對(duì)象實(shí)例,但是這兩個(gè)對(duì)象是無(wú)法被作為girlFriend對(duì)象來(lái)識(shí)別的,因?yàn)樗齻儽揪褪窃谝粋€(gè)函數(shù)內(nèi)部執(zhí)行的過(guò)程中被創(chuàng)造出來(lái)的,之間并不存在什么聯(lián)系,這在開(kāi)發(fā)中并不利于我們追根溯源,不信我們來(lái)看看
console.log(rei instanceof GirlFriend);//false
整這么半天,生成的Rei根本就不是girlFriend,只是看上去像而已/復(fù)制品
那我們換一種思路,既然js中函數(shù)皆對(duì)象,能不能有這么一個(gè)函數(shù)/對(duì)象,他本身可以傳入?yún)?shù),然后以他本身為模版創(chuàng)造出相同類(lèi)型的實(shí)例對(duì)象呢,js中就提供了一種特殊的函數(shù),叫做構(gòu)造函數(shù),他的任務(wù)就是根據(jù)我們的要求/傳的參數(shù),創(chuàng)造出和自己類(lèi)型相同的的對(duì)象,而這種創(chuàng)建方法這就是坊間傳說(shuō)的構(gòu)造函數(shù)法
GirlFriend = function(name, moeType, hairColor) { this.name = name; this.moeType = moeType; this.hairColor = hairColor; this.sayHello = function() { return moeType == "silent" ? "..." : "Ohayo!" } }
這就是一個(gè)構(gòu)造函數(shù)了,對(duì)他的使用就如同我們?cè)谡{(diào)用許多被封裝好的js庫(kù)一樣,其實(shí)都是按照自己的需求實(shí)例化js庫(kù)作者提前定義好的對(duì)象(這只是一個(gè)說(shuō)話,構(gòu)造函數(shù)中并沒(méi)有對(duì)象)
具體的方法如下
var rei = new GirlFriend("Rei", "silent", "blue"); var asuka = new GirlFriend("Atsuka", "genki", "red"); console.log(rei.sayHello());//... console.log(asuka.sayHello());//Ohayo!
構(gòu)造函數(shù)是一種特殊的函數(shù),需要配合new來(lái)使用,在使用new運(yùn)算符時(shí)執(zhí)行了以下步驟
1.創(chuàng)建一個(gè)新的對(duì)象
2.將構(gòu)造函數(shù)作用域賦給新的對(duì)象(即this指向新對(duì)象,只有通過(guò)this才能訪問(wèn))
3.執(zhí)行構(gòu)造函數(shù)里面的代碼
4.返回新的對(duì)象
部分引自js工廠模式、構(gòu)造函數(shù)以及他們創(chuàng)建對(duì)象的優(yōu)缺點(diǎn)?— 第6.2.1節(jié) - flyingpig2016
回過(guò)頭來(lái)檢查以下
console.log(rei instanceof GirlFriend);//true console.log(asuka instanceof GirlFriend);//true
這回ok了,Rei和Asuka妥妥的都是girlFriend了
當(dāng)然,這種創(chuàng)建模式,還存在一些問(wèn)題,并且還有其他的創(chuàng)建模式,放在下一篇博文中繼續(xù)踩坑啦
能看到這里都明白的估計(jì)是個(gè)死宅了
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92059.html
摘要:溫馨提示作者的爬坑記錄,對(duì)你等大神完全沒(méi)有價(jià)值,別在我這浪費(fèi)生命溫馨提示續(xù)本文內(nèi)容簡(jiǎn)單,發(fā)揚(yáng)了潛入潛出的精神,請(qǐng)謹(jǐn)慎浪費(fèi)時(shí)間溫馨提示再續(xù)魔卡少女櫻動(dòng)畫(huà)再開(kāi)撒花經(jīng)過(guò)前兩篇文章的梳理對(duì)象不完全探索記錄小伙子,你對(duì)象咋來(lái)的上篇對(duì)象不完全探索記 溫馨提示:作者的爬坑記錄,對(duì)你等大神完全沒(méi)有價(jià)值,別在我這浪費(fèi)生命溫馨提示-續(xù):本文內(nèi)容簡(jiǎn)單,發(fā)揚(yáng)了潛入潛出的精神,請(qǐng)謹(jǐn)慎浪費(fèi)時(shí)間溫馨提示-再續(xù):《魔...
摘要:譯者注根據(jù)定義,沒(méi)有原型,并作為這個(gè)原型鏈中的最后一個(gè)環(huán)節(jié)。由于這個(gè)屬性不標(biāo)準(zhǔn),因此一般不提倡使用。中用函數(shù)獲得一個(gè)對(duì)象的。 溫馨提示:作者的爬坑記錄,對(duì)你等大神完全沒(méi)有價(jià)值,別在我這浪費(fèi)生命 在上一篇博文javascript對(duì)象不完全探索記錄03:小伙子,你對(duì)象咋來(lái)的?上篇,中大概說(shuō)了說(shuō)在js中,比較好理解的對(duì)象創(chuàng)建方式,分別是直接定義/字面量,和調(diào)用構(gòu)造函數(shù) 你對(duì)象還有原型? 在一...
摘要:這是因?yàn)樽宇?lèi)沒(méi)有自己的對(duì)象,而是繼承父類(lèi)的對(duì)象,然后對(duì)其進(jìn)行加工。 溫馨提示:作者的爬坑記錄,對(duì)你等大神完全沒(méi)有價(jià)值,別在我這浪費(fèi)生命溫馨提示-續(xù):你們要非得看,我也攔不住,但是至少得準(zhǔn)備個(gè)支持ES6的Chrome瀏覽器吧?溫馨提示-再續(xù):ES6簡(jiǎn)直了,放著不用簡(jiǎn)直令人發(fā)指! 書(shū)接上回,即便是程序員,也還是能夠通過(guò)自己的努力辛辛苦苦找到合適對(duì)象的,見(jiàn)前文《javascript對(duì)象不完全...
摘要:基礎(chǔ)語(yǔ)法參數(shù)參數(shù)參數(shù)函數(shù)聲明參數(shù)參數(shù)參數(shù)表達(dá)式單一相當(dāng)于參數(shù)參數(shù)參數(shù)表達(dá)式當(dāng)只有一個(gè)參數(shù)時(shí),圓括號(hào)是可選的單一參數(shù)函數(shù)聲明單一參數(shù)函數(shù)聲明沒(méi)有參數(shù)的函數(shù)應(yīng)該寫(xiě)成一對(duì)圓括號(hào)。 溫馨提示:作者的爬坑記錄,對(duì)你等大神完全沒(méi)有價(jià)值,別在我這浪費(fèi)生命溫馨提示-續(xù):你們要非得看,我也攔不住,但是至少得準(zhǔn)備個(gè)支持ES6的Chrome瀏覽器吧? 之前在某些大神的代碼中出現(xiàn)一串神秘符號(hào)類(lèi)似于num =>...
摘要:閉包一詞來(lái)源于以下兩者的結(jié)合要執(zhí)行的代碼塊由于自由變量被包含在代碼塊中,這些自由變量以及它們引用的對(duì)象沒(méi)有被釋放和為自由變量提供綁定的計(jì)算環(huán)境作用域。在以及及以上等語(yǔ)言中都能找到對(duì)閉包不同程度的支持。 溫馨提示:作者的爬坑記錄,對(duì)你等大神完全沒(méi)有價(jià)值,別在我這浪費(fèi)生命 閉包,好吃嗎 ? 第一次聽(tīng)到這個(gè)詞,很不幸是在一次面試中,可想而知結(jié)果很細(xì)碎,從此閉包和跨域在我匱乏的前端知識(shí)中成為了...
閱讀 1881·2021-11-15 11:39
閱讀 1088·2020-12-03 17:06
閱讀 742·2019-12-27 11:42
閱讀 3277·2019-08-30 13:59
閱讀 1469·2019-08-26 13:22
閱讀 3291·2019-08-26 12:15
閱讀 2479·2019-08-26 10:22
閱讀 1566·2019-08-23 18:40