成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

淺談OOP Javascript [2] -- 構(gòu)造函數(shù)

didikee / 331人閱讀

摘要:構(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

相關(guān)文章

  • 淺談 OOP JavaScript [完結(jié)章] -- 繼承

    摘要:構(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)...

    張利勇 評(píng)論0 收藏0
  • 淺談 OOP JavaScript [3] -- 原型

    摘要:上一章我們談了構(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...

    SQC 評(píng)論0 收藏0
  • 淺談OOP Javascript [1]

    摘要:工廠(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)的概念! 又談作用域 首先...

    xinhaip 評(píng)論0 收藏0
  • 淺談JavaScript中的面向?qū)ο?/b>

    摘要:面向?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ì)的目的是在編程中促...

    Magicer 評(píng)論0 收藏0
  • 淺談JavaScript繼承

    摘要:注意這里跟原型鏈繼承有個(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í)候,再看...

    raoyi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<