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