摘要:構(gòu)造函數(shù)上一章我們講了工廠(chǎng)模式,它的缺點(diǎn)就是無(wú)法識(shí)別到底哪個(gè)屬于哪個(gè)的問(wèn)題。我們可以用構(gòu)造函數(shù)來(lái)解決這個(gè)識(shí)別問(wèn)題。來(lái)比較構(gòu)造函數(shù)內(nèi)的值就可以看出到底是什么類(lèi)型。
構(gòu)造函數(shù)
上一章我們講了工廠(chǎng)模式,它的缺點(diǎn)就是無(wú)法識(shí)別到底哪個(gè)屬于哪個(gè)的問(wèn)題。我們可以用構(gòu)造函數(shù)來(lái)解決這個(gè)識(shí)別問(wèn)題。
//構(gòu)造函數(shù) function Create(a,b) { this.a =a; this.b =b; this.c = function () { return this.a + this.b; }; } var box = new Create("abc",10); alert(box.run()); //返回abc10
我們參考上一章,發(fā)現(xiàn)構(gòu)造函數(shù)和工廠(chǎng)模式的區(qū)別:
1.沒(méi)有集中實(shí)例化
2.沒(méi)有返回對(duì)象實(shí)例
3.直接將屬性和方法賦值給this
1.我們不需要在構(gòu)造函數(shù)內(nèi)集中實(shí)例化,因?yàn)樵趧?chuàng)建構(gòu)造函數(shù)的同時(shí),后臺(tái)會(huì)自動(dòng)創(chuàng)建一個(gè)實(shí)例化。
2.我們不需要返回這個(gè)對(duì)象的實(shí)例化,因?yàn)樗呛笈_(tái)自動(dòng)返回的。
3.this就相當(dāng)于工廠(chǎng)模式的obj.a;
解決對(duì)象實(shí)例歸屬問(wèn)題
如果我們想查看歸屬問(wèn)題。必須要?jiǎng)?chuàng)建兩個(gè)構(gòu)造函數(shù):
function Create(a,b) { this.a =a; this.b =b; this.c = function () { return this.a + this.b; }; } function DeskTop(a,b) { this.a =a; this.b =b; this.c = function () { return this.a + this.b; }; } var box = new Create("abc",10); var box1 = new DeskTop("def",20); alert(box instanceof Object); //這里要注意:所有的構(gòu)造函數(shù)的對(duì)象都是Object. alert(box instanceof Create); //true alert(box1 instanceof Create); //false alert(box1 instanceof DeskTop); //true
構(gòu)造函數(shù)編寫(xiě)規(guī)范:
1.構(gòu)造函數(shù)也是函數(shù),但是函數(shù)名的第一個(gè)字母大寫(xiě)
2.必須使用new運(yùn)算符
3.必須使用new + 等同上面的函數(shù)名(首字母大寫(xiě))例如:var box = new Create();
構(gòu)造函數(shù)和普通函數(shù)的區(qū)別:
1.普通函數(shù),首字母無(wú)需大寫(xiě)
2.構(gòu)造函數(shù),用普通函數(shù)調(diào)用方式無(wú)效
構(gòu)造函數(shù)內(nèi)的方法是:基本類(lèi)型 or 引用類(lèi)型??
我們可以通過(guò)例子來(lái)看出來(lái)到底是普通類(lèi)型還是引用類(lèi)型:
function Create(a,b) { this.a =a; this.b =b; this.c = function () { return this.a + this.b; }; } var abc = new Create("abc",10); var abc1 = new Create("abc",10);
我們講兩個(gè)傳同樣的值。來(lái)比較構(gòu)造函數(shù)內(nèi)的值就可以看出到底是什么類(lèi)型。
alert(abc.a == abc1.a); //true //因?yàn)閭鬟M(jìn)去的實(shí)參相同,肯定是相同的 alert(abc.b == abc1.b); //true //同上 alert(abc.c == abc1.c); //false //這里看出,他們比較的是引用地址,大家都知道引用地址肯定不相等!
基本數(shù)據(jù)類(lèi)型的變量存放的是基本類(lèi)型數(shù)據(jù)的實(shí)際值。而引用數(shù)據(jù)類(lèi)型的變量保存對(duì)它的引用,即指針。
注:為什么用abc.c而不是abc.c(),因?yàn)閍bc.c是表示的引用地址,而abc.c()是返回這個(gè)引用類(lèi)型的值。
如果大家還沒(méi)懂為什么,可以用一張圖來(lái)解釋?zhuān)?script type="text/javascript">showImg("https://segmentfault.com/img/bVF4Xg?w=636&h=169");
基本類(lèi)型和引用類(lèi)型
雖然這個(gè)與今天的話(huà)題好像沒(méi)啥太大關(guān)系。但是我感覺(jué)我們還是有必要復(fù)習(xí)一下基礎(chǔ)知識(shí)。
基本類(lèi)型:
基本類(lèi)型的比較是值的比較
基本類(lèi)型是存放在棧內(nèi)存中的。
基本類(lèi)型的值是無(wú)法改變的。
引用類(lèi)型:
引用類(lèi)型的值是可以改變的。
引用類(lèi)型的比較是引用的比較
引用類(lèi)型是同時(shí)存放在棧內(nèi)存和堆內(nèi)存中的。
(棧內(nèi)存中存放的是這個(gè)變量名,而堆內(nèi)存存放的是地址,我們?nèi)フ{(diào)用時(shí)會(huì)有一個(gè)指針指向堆內(nèi)存的。)
而每次實(shí)例化,地址都不相同,所以比較引用類(lèi)型的地址肯定不相同?。?!
下一章我們來(lái)講原型。
文章內(nèi)容有錯(cuò)誤請(qǐng)及時(shí)聯(lián)系作者指正!謝謝!
**Brian Lee**
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/81067.html
摘要:構(gòu)造函數(shù)通過(guò)原型繼承了構(gòu)造函數(shù)和原型,這就形成了一個(gè)鏈條,通俗的講就是原型鏈繼承。而且方法只能冒充構(gòu)造函數(shù)里面的屬性和方法而無(wú)法冒充原型對(duì)象里面的屬性和方法還有最大的問(wèn)題就是重復(fù)使用。 前言: 寫(xiě)到這里,差不多就把OOP完結(jié)了,寫(xiě)了幾篇OOP的文章,但是只是略懂皮毛,可能深入的OOP還有很多,但是我感覺(jué)寫(xiě)到這里也算是差不多完結(jié)了。 繼承 繼承是面向?qū)ο蟊容^核心的概念,其他語(yǔ)言可能實(shí)現(xiàn)...
摘要:上一章我們談了構(gòu)造函數(shù),他的唯一特點(diǎn)就是比較了地址不相同,因?yàn)榇蠹抑酪妙?lèi)型是比較的引用。也就是說(shuō)不用在構(gòu)造函數(shù)中定義對(duì)象實(shí)例,而是直接將這些添加到原型當(dāng)中。如果構(gòu)造函數(shù)實(shí)例里面沒(méi)有,就去原型里面查找,如果有就立即返回。 上一章我們談了構(gòu)造函數(shù),他的唯一特點(diǎn)就是比較了地址不相同,因?yàn)榇蠹抑酪妙?lèi)型是比較的引用。我們來(lái)談?wù)勗汀?原型 我們每創(chuàng)建一個(gè)函數(shù)都有一個(gè)原型(prototyp...
摘要:工廠(chǎng)模式優(yōu)點(diǎn)集中實(shí)例化,可以傳參等缺點(diǎn)分不清屬于哪個(gè)對(duì)象我們先來(lái)談?wù)剝?yōu)點(diǎn),看例子集中實(shí)例化返回實(shí)例化對(duì)象返回返回不難看出,工廠(chǎng)模式比上面的例子減少了很多代碼。 ECMAscript開(kāi)發(fā)的兩種模式:1.過(guò)程化 2.OOP(面向?qū)ο? 面向?qū)ο蟮恼Z(yǔ)言有一個(gè)標(biāo)志,那就是類(lèi)的概念,而通過(guò)類(lèi)可以創(chuàng)建任意多個(gè)具有相同屬性的方法的對(duì)象。但是ECMAscript中沒(méi)有類(lèi)的概念! 又談作用域 首先...
摘要:面向?qū)ο竺嫦驅(qū)ο缶幊痰娜Q(chēng)是,簡(jiǎn)稱(chēng),面向?qū)ο缶幊淌怯贸橄蠓绞絼?chuàng)建基于現(xiàn)實(shí)世界模型的一種編程模式。面向?qū)ο缶幊痰娜齻€(gè)主要特征是封裝繼承多態(tài)。 面向?qū)ο?面向?qū)ο缶幊痰娜Q(chēng)是Object Oriented Programming,簡(jiǎn)稱(chēng)OOP,面向?qū)ο缶幊淌怯贸橄蠓绞絼?chuàng)建基于現(xiàn)實(shí)世界模型的一種編程模式。面向?qū)ο缶幊炭梢钥醋鍪鞘褂靡幌盗袑?duì)象相互協(xié)作的軟件設(shè)計(jì),面向?qū)ο蟪绦蛟O(shè)計(jì)的目的是在編程中促...
摘要:注意這里跟原型鏈繼承有個(gè)比較明顯的區(qū)別是并沒(méi)有使用繼承而是在子類(lèi)里面執(zhí)行父類(lèi)的構(gòu)造函數(shù)相當(dāng)于把父類(lèi)的代碼復(fù)制到子類(lèi)里面執(zhí)行一遍這樣做的另一個(gè)好處就是可以給父類(lèi)傳參。 Javascript繼承 學(xué)過(guò)后端語(yǔ)言的同學(xué)對(duì)繼承并不陌生,但是對(duì)JS繼承少許還是有些困惑,不要試圖問(wèn)我是如果知道的,其實(shí)javascript繼承主要是基于原型prototype實(shí)現(xiàn)的。 其實(shí)當(dāng)你真正了解了原型鏈時(shí)候,再看...
閱讀 3464·2019-08-30 10:54
閱讀 3160·2019-08-29 16:38
閱讀 2189·2019-08-26 14:06
閱讀 1521·2019-08-23 15:39
閱讀 3046·2019-08-23 15:37
閱讀 2892·2019-08-23 13:50
閱讀 3199·2019-08-22 17:14
閱讀 2392·2019-08-22 15:44