如果理解不了什么是面向?qū)ο?,那有什么必要去理解?也許換個(gè)角度想想,我們理解了面向?qū)ο竽芨蓡幔?/p>
“javascript面向?qū)ο蟆保笆裁词莏avascript面向?qū)ο蟆?,“什么是prototype和__proto__”,“什么是Object和Function”...........等等諸如這一系列問(wèn)題。
我相信你不止一次在百度搜索這些關(guān)鍵字,而且確信你點(diǎn)開(kāi)一個(gè)搜索內(nèi)容看的前幾句一般都是諸如此類的解釋:
“函數(shù)才有prototype對(duì)象有__proto__”
“對(duì)象:對(duì)象是一個(gè)整體,對(duì)外提供一些操作”
“面向?qū)ο蟮恼Z(yǔ)言有一個(gè)標(biāo)志,那就是類的概念,而通過(guò)類可以創(chuàng)建任意多個(gè)具有相同屬性和方法的對(duì)象。但是,ECMAScript 沒(méi)有類的概念,因此它的對(duì)象也與基于類的語(yǔ)言中的對(duì)象有所不同?!?。。。。。
.........................................我更相信你看了一篇博文前面幾句然后又點(diǎn)開(kāi)下一篇博文如此反復(fù)
接著就抽根煙開(kāi)始懷疑人生,“難道我學(xué)不會(huì)javascript”
當(dāng)你點(diǎn)開(kāi)這篇文章的時(shí)候,你應(yīng)該還是沒(méi)有理解,我相信你是花了很多時(shí)間才找到的,因?yàn)槲业牟┛筒怀雒?/p>
既然如此累還是搞不懂我們和不妨靜下心來(lái),休息一會(huì),拉會(huì)家常,
生活,沒(méi)必要把自己搞得那么狼狽不堪,那么累
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?正文
在開(kāi)始擺龍門陣之前,我要求你放下面向?qū)ο螅彤?dāng)不存在這個(gè)概念。因?yàn)槊嫦驅(qū)ο蟊緛?lái)就是一種描述抽象事物的形容詞叫法。重要的事情說(shuō)三遍,"放下面向?qū)ο?,反正你都不理解那要他何用?(你叫貓的名字它不過(guò)來(lái),那為什么要給他取名字勒?)
第一步:(預(yù)備知識(shí))
? ? 1:首先你應(yīng)該具備基礎(chǔ)知識(shí)(相信你看到這篇博客應(yīng)該是具備了)
????2:其次你應(yīng)該對(duì)對(duì)象為什么"引用類型"有一個(gè)比較抽象的理解(比如能用生活當(dāng)中的例子舉例)
? ?3:對(duì)函數(shù)的屬性和作用于以及this有那么一點(diǎn)深入了解,知道什么是上下文會(huì)更好(一會(huì)用的不多),prototype和__proto__知道就行,主要就是扯他們
第二步(我們從一個(gè)故事開(kāi)始入手)
"萬(wàn)物都有根,一切皆無(wú)形"(講一個(gè)中國(guó)傳統(tǒng)的故事:女?huà)z造人應(yīng)該知道吧,創(chuàng)世女神女?huà)z化生萬(wàn)物?[1]?,每天至少能創(chuàng)造出七十樣?xùn)|西?[2]?,開(kāi)世造物,因此被稱為大地之母[3-6]?。她是古老相傳的大母神。相傳女?huà)z以泥土仿照自己摶土造人,創(chuàng)造并構(gòu)建人類社會(huì);又替人類立下了婚姻制度,使青年兩性相互婚配,繁衍后代,因此也被傳為主職姻緣與情愛(ài)的皋禖古神。)
?那么問(wèn)題來(lái)了:女?huà)z是誰(shuí)造的?
你要是解釋清楚了那我們就無(wú)話可說(shuō)了,但如果我們要是解釋不清楚怎么辦?
答案:涼拌,既然解釋不清楚那我們何不把他當(dāng)真相去對(duì)待?不過(guò)我們可以試圖去尋找真相
Object()是什么?
function fun(){......}? ? ? ? ? ?function Person(){......}
Object()和fun()以及Person()他們其實(shí)就是一個(gè)函數(shù)
function Object(){......}//調(diào)用函數(shù)就要寫(xiě)成Object()
但是為什么我們直接打開(kāi)編輯器什么都不寫(xiě)直接console.log(Object())或者瀏覽器控制臺(tái)直接Object()會(huì)創(chuàng)建一個(gè)對(duì)象,那為什么console.log(fun())就報(bào)錯(cuò)勒;--》那是不是說(shuō)明javascript本身就有Object這個(gè)函數(shù),而沒(méi)有fun--》這就是內(nèi)置構(gòu)造函數(shù)
那什么是--------構(gòu)造函數(shù)?
我們從文字表面來(lái)理解"構(gòu)造"兩個(gè)字(注意,不包含“函數(shù)兩個(gè)字”):比如我需要一件衣服,那么我是不是要去商店買一件衣服。那么我現(xiàn)在需要生產(chǎn)衣服,那你是不是的建一個(gè)生產(chǎn)衣服的工廠???當(dāng)然,你也可以手工一件一件的做,工廠做一百件你同樣能做一百件。
(先不說(shuō)賣衣服)我生產(chǎn)一件衣服的情況就好比我需要一個(gè)對(duì)象
var obj = {
name:"adidashi",
? ? ? ? color:"red",
? ? ? ? ?temperature:function(){........}
}
那如果我要生產(chǎn)10件怎么辦,(有的婦女確實(shí)能織出十件甚至更多),那我要生產(chǎn)100件,1000件怎么辦呢?難道你要寫(xiě)一百個(gè)一千個(gè)對(duì)象?,顯然都是一樣的衣服一樣重復(fù)的代碼
那么只有建立工廠,(就比如說(shuō)你真的要生產(chǎn)衣服(大規(guī)模的)在現(xiàn)實(shí)生活當(dāng)中你也必須要建立工廠)
如何創(chuàng)建工廠:
首先得選地方,那么我們就用函數(shù)吧?
接著工廠造好了,是不是得有那么一個(gè)模板,就比如街上那種小蛋糕,他是用模板一次可以做很多個(gè),如果用手捏一次只能捏一個(gè),制衣廠那種流水線
模板:對(duì)于模板生產(chǎn)出來(lái)的東西就只有一個(gè)有共同點(diǎn),"都是一樣的"。同一個(gè)批次的衣服品牌一樣把,大小一樣把,顏色一樣把...................
//,工廠建好了我們是不是需要對(duì)原料進(jìn)行加工,然后出廠
第一步:原料(就是一個(gè)空對(duì)象)
? ? var obj={}
第二步:我們需要對(duì)原料加工
????obj .name="adidas"
obj .color="red"
obj .temperature=function(){.........}
第三步:出廠
? ? ? return obj;
}
出廠的目的就是讓別人來(lái)買啊,假設(shè)有兩個(gè)人來(lái)買,
var person1=GarmentFactory( );
var person2=?GarmentFactory( );
弊端:如果所有對(duì)象name的值不一樣要去改函數(shù)源代碼或者對(duì)象自己本身(person1),那樣應(yīng)該很麻煩吧,那么為什么我們不可以通過(guò)參數(shù)賦值呢?后面會(huì)解決的
這兩個(gè)人如果要買衣服那么就是說(shuō)他們必須要?dú)v經(jīng)造一個(gè)工廠(重復(fù)調(diào)用函數(shù),這是性能問(wèn)題了),買原料,出廠,其實(shí)說(shuō)白了,就是對(duì)象字面量的簡(jiǎn)寫(xiě),"但是我們的這個(gè)工廠的確是模板的一個(gè)完美解釋"與其寫(xiě)十個(gè)字面量一樣的對(duì)象,不如用函數(shù)吧把他們的共同點(diǎn)裝在一起,需要衣服就去調(diào)用一函數(shù)。
那么問(wèn)題又來(lái)了?
為什么我要買一件衣服,就要去建一個(gè)工廠,買十件衣服就要建十個(gè)工廠(相當(dāng)于在計(jì)算機(jī)內(nèi)存開(kāi)辟十個(gè)存儲(chǔ)空間然后又不要這十個(gè)空間如此反復(fù)),明明都是一樣的衣服,很顯然這是沒(méi)必要的,那么我們?nèi)绾巫龅街恍枰粋€(gè)工廠而做到不需要每次買衣服就建工廠勒?
new:我們需要一個(gè)代理人,和工廠聯(lián)系?。?!
new(官網(wǎng)有解釋):運(yùn)算符,任何函數(shù)都可以new,用來(lái)初始化對(duì)象的,一旦通過(guò)new調(diào)用的函數(shù)就叫構(gòu)造函數(shù),(你自己開(kāi)工廠造衣服你叫老板,而你通過(guò)代理人買衣服你叫顧客,然而你還是你,同樣的,你當(dāng)老板干的事和你當(dāng)顧客或者代理人的事情都不一樣"你爸爸叫你叫兒子,你爺爺叫你叫孫子")
既然new是代理人,那么肯定有過(guò)人之處,在使用new的過(guò)程;
1:在函數(shù)內(nèi)部生成一個(gè)對(duì)象(空對(duì)象){ }
2:吧函數(shù)內(nèi)部this引用綁定到這個(gè)對(duì)象上
3:隱式的返回這個(gè)對(duì)象(那么也就是說(shuō)new表達(dá)式的值是這個(gè)對(duì)象)
function GarmentFactory(){
1:在函數(shù)內(nèi)部生成一個(gè)對(duì)象(空對(duì)象){ }//對(duì)程序員不可見(jiàn)
? ? ? ? var obj={}
2:吧函數(shù)內(nèi)部this引用綁定到這個(gè)對(duì)象上,這是硬行規(guī)定
? ? ? ? obj.name="adidas"
? ? ? ? obj.color="red"
? ? ? ? obj.temperature=function(){}
3:隱式的返回這個(gè)對(duì)象(那么也就是說(shuō)new表達(dá)式的值是這個(gè)對(duì)象(那么也就是說(shuō)new表達(dá)式的值是這個(gè)對(duì)象當(dāng)然也可以顯示返回,不過(guò)沒(méi)必要,自己去了解))
? ? ? ? return obj;
}
簡(jiǎn)寫(xiě)如下形式==》
function GarmentFactory(name,color){
? ? ? ? this.name=name
? ? ? ? this.color=color
? ? ? ? this.temperature=function(){}
}
var obj = newGarmentFactory()
注意:第二步已經(jīng)將this綁定到返回的這個(gè)對(duì)象,而對(duì)象又通過(guò)賦值給了obj,他們的區(qū)別在于obj什么都不是,就像你的名字什么也不是,但總得用個(gè)什么名字稱呼你這個(gè)實(shí)體吧?。。∧敲磘his就指向了obj,他就有屬性和方法了,到這里了,我們給obj下一個(gè)定義,“他通過(guò)這么復(fù)雜的方式創(chuàng)建的對(duì)象特殊在哪里?即便每次創(chuàng)建對(duì)象依然是去調(diào)用一遍函數(shù)”-----》實(shí)際上和字面量是一樣的,那為什么要用怎么復(fù)雜的方式創(chuàng)建對(duì)象?
任何復(fù)雜的方法都是為了去解決更復(fù)雜的事情,
假設(shè)你現(xiàn)在還在生產(chǎn)衣服,那么就會(huì)有一個(gè)問(wèn)題(這應(yīng)該不算是問(wèn)題),明明每一個(gè)衣服都有名字,而且都是相同的,那為什么我們要給每一個(gè)衣服取個(gè)名字(是不是暈了)。再舉個(gè)例子,人一生下來(lái)是不會(huì)走路的,那我為什么不跟著別人學(xué)走路而要自己發(fā)明一個(gè)怎么走路呢?每個(gè)人都會(huì)走路,但大家走路的姿勢(shì)又各不相同,總之目的都是一樣的,
現(xiàn)在我們先把這個(gè)工廠放在一邊,我們說(shuō)說(shuō)人(就我們自己的特征)
相親除了問(wèn)你有什么或者會(huì)什么他還能問(wèn)什么(博主是遭遇過(guò)的)
1,人都有什么:每個(gè)人都有名字,年齡,眼睛,鼻子...........這些屬于一個(gè)人的基本特征吧(或者叫屬性)(這些都是有狀態(tài)的,比如年齡會(huì)增加,名字會(huì)改變,但他們能殺人放火嗎?)
2,人都會(huì)什么:每個(gè)人都會(huì)吃飯,睡覺(jué),談戀愛(ài)等等。。。。。這些屬于一個(gè)人行為吧(這些沒(méi)有什么狀態(tài),但他們是行為,是為了操作狀態(tài),語(yǔ)文當(dāng)中動(dòng)詞描述的哪一類)
總結(jié):我們把這寫(xiě)人的基本特征或者基本行為定義為一個(gè)模板,我們是不是就可以造小人了,就比如女?huà)z把他自己當(dāng)成模板
那我們就開(kāi)始女?huà)z造人(我們這里要假設(shè)人可以在一秒鐘學(xué)會(huì)走路,不然故事沒(méi)法編了)
function Person(name,color){
? ? ? ? this.name=name
? ? ? ? this.age=18
? ? ? ? this.eat=function(){}
}
var obj1=?Person()
var obj2=?Person()
var obj3=?Person()
在上面的例子當(dāng)中,obj1,obj2,obj3都是一個(gè)個(gè)具體的人,他們都可以有名字,年齡,會(huì)吃飯等一系列人所具備的(只是我寫(xiě)的少而已),那么我們不禁思考一個(gè)問(wèn)題,每個(gè)人的名字的確不一樣,年齡也是不一樣的,但每個(gè)人張嘴吃飯的動(dòng)作確是一樣的,在程序當(dāng)中,你new出來(lái)的實(shí)例(就是obj123)他們就相當(dāng)于我們?nèi)松聛?lái)不是跟著父母學(xué)走路的,而是自己摸索怎么走路的。娶一個(gè)名字幾秒鐘就夠了,但是走路就算有人教也得幾年吧?
這個(gè)時(shí)候,就得有一個(gè)相對(duì)祖先,把她會(huì)的繼承下來(lái),而不是我們每個(gè)人都去發(fā)明自己怎么走路
(當(dāng)然,人本來(lái)就是可以繼承,但程序中的繼承是你生下來(lái)馬上就會(huì)走路蹦迪遛狗了)
prototype就是祖先(官方解釋不想說(shuō)了)
只有函數(shù)才有prototype屬性,而他的屬性值是一個(gè)對(duì)象(就是一個(gè)普通對(duì)象)
//下午接著扯,困會(huì)瞌睡