本文主要總結(jié)javascript中的各種對象創(chuàng)建方法
以及這些方法的特點辐脖,優(yōu)缺點等特性蝉衣。
1.通過原生js的Object()構(gòu)造方法創(chuàng)建對象
2.通過字面量的方式創(chuàng)建對象
注:以上兩種方式創(chuàng)建對象都有很大的局限性放航,如果要創(chuàng)建多個對象司恳,則需要書寫很多重復(fù)的代碼。并且顶伞,對于創(chuàng)建統(tǒng)一種類型(具有相同的成員變量和方法)的對象也無能為力
3.工廠模式:
? ? 1)工廠模式的描述:
? ? ? ? 工廠模式就是為了彌補(bǔ)以上兩種方式創(chuàng)建對象的不足喝峦,將創(chuàng)建具體對象的過程進(jìn)行了抽象付燥,用函數(shù)的形式封裝了創(chuàng)建對象的細(xì)節(jié)。
? ? 2)使用工廠模式創(chuàng)建對象的代碼實例:
? ? 3)工廠模式的缺點:
? ? 工廠模式雖然解決了上面兩種方式創(chuàng)建多個相似對象的缺陷愈犹,但是沒有解決對象識別的問題键科。就是說,通過工廠模式創(chuàng)建的對象漩怎,沒有辦法知道它是通過什么構(gòu)造函數(shù)創(chuàng)建的勋颖,是屬于Person類型,還是Student對象勋锤。只能知道它屬于Object類型饭玲。
4.構(gòu)造函數(shù)模式
? ? 1)通過構(gòu)造函數(shù)形式創(chuàng)建對象實例:
? ? 注:一般將構(gòu)造函數(shù)的函數(shù)名的首字母大寫,作為構(gòu)造函數(shù)的表示
? ??2)調(diào)用構(gòu)造函數(shù)經(jīng)歷的四個步驟:
? ? ? ? 1.創(chuàng)建一個新對象叁执;
? ? ? ? 2.將構(gòu)造函數(shù)的作用域賦給新對象(改變this指向)茄厘;
? ? ? ? 3.執(zhí)行構(gòu)造函數(shù)中的代碼
? ? ? ? 4.返回新對象;
? ? 3)constructor的作用:
? ? 通過構(gòu)造函數(shù)創(chuàng)建的對象都有一個constructor屬性谈宛。這個屬性的作用就是指向構(gòu)造函數(shù)次哈,因此,可用于識別對象的類型
? ? 4)優(yōu)點:
? ? 通過自定義的構(gòu)造函數(shù)創(chuàng)建出來的對象實例的類型就是唯一確認(rèn)的吆录,這就是構(gòu)造函數(shù)方式強(qiáng)于工廠模式的地方
? ? 5)缺點:
? ? 構(gòu)造函數(shù)的缺點就是:函數(shù)中的成員方法在每次創(chuàng)建實例的時候就要再創(chuàng)建一遍
? ? 缺陷改進(jìn):
? ? 要改進(jìn)這個缺陷也很容易窑滞,因為我們知道在使用構(gòu)造函數(shù)創(chuàng)建對象實例的時候的一大特點就是改變了this指向,所以,我們可以根據(jù)這個特性哀卫,將構(gòu)造函數(shù)中的成員方法提到構(gòu)造函數(shù)之外巨坊,定義為全局的方法,再通過this實現(xiàn)相同的效果此改。代碼如下:
? ? 6)仍然存在的問題:
? ? 將成員方法定義在構(gòu)造函數(shù)之外趾撵,雖然解決了創(chuàng)建對象時重復(fù)創(chuàng)建成員方法,但是當(dāng)成員方法很多時共啃,那么意味著定義在構(gòu)造函數(shù)外部的全局函數(shù)也很多鼓寺,那么此時,我們定義的構(gòu)造函數(shù)相當(dāng)于只封裝了少量的成員屬性勋磕,而大部分的成員方法都在外面,所以敢靡,降低了構(gòu)造函數(shù)的 封裝性挂滓。
? ? 所有,引出使用原型創(chuàng)建對象的方法啸胧。
5.原型模式
? ? 1)描述:
? ? 在js中赶站,創(chuàng)建的每個函數(shù)都有一個prototype 屬性,這個屬性是一個指針纺念,它本身也是一個對象贝椿,指向的這個構(gòu)造函數(shù)
? ? 2)使用原型方式創(chuàng)建對象