1黍判,如何創(chuàng)建一個對象
① 原始方法:?通過new關鍵字生成一個對象惠毁,然后根據javascript是動態(tài)語言的特性來添加屬性和方法,構造一個對象栖博。其中的this表示調用該方法的對象聂渊。這種方式的問題是如果需要多次創(chuàng)建對象,那么需要重復代碼多次异逐,不利于代碼的復用。
② 工廠方法:? 這種方式提高了代碼重用率插掂,還可以改變工廠方法灰瞻,傳入參數賦值。
該方式雖然可以提高代碼的重用率辅甥,但和面向對象中類的概念相比酝润,有一個很大的缺陷。面向對象強調對象的屬性私有璃弄,但對象的方法是共享的要销。而上面的工廠方法在創(chuàng)建對象時,要為每個對象創(chuàng)建各自私有的方法谢揪。同時蕉陋,由于為每個對象都創(chuàng)建邏輯相同的方法捐凭,所以很浪費內存拨扶。
改進代碼:? 下面通過定義幾個函數對象凳鬓,解決了不同對象持有函數對象的私有問題。現(xiàn)在所有對象的方法都持有上面兩個函數的引用患民。但這么一來缩举,對象的函數又和對象相互獨立了,這和面向對象中特定方法屬于特定類的思想不符合匹颤。
③ 構造函數方式:? 構造函數的方式和工廠方式一樣仅孩,會為每個對象創(chuàng)建獨享的函數對象。當然也可以將這些函數對象定義在構造函數外面印蓖,這樣又有了對象和方法相互獨立的問題辽慕。
④ 原型方法:? 當生成Person對象時,prototype屬性都賦值給了新的對象赦肃。那么屬性和方法是共享的溅蛉。首先,該方法的問題是構造函數不能傳遞參數他宛,每個新生成的對象都有默認值船侧。其次,方法共享沒有任何問題厅各,但是镜撩,當屬性是可改變狀態(tài)的對象時,屬性共享就有問題了队塘。
下面的代碼通過obj1向obj1添加屬性時袁梗,obj2的array屬性的元素也跟著受到影響,原因就在于obj1和obj2對象的array屬性引用的是同一個Array對象憔古。
⑤ 混合的構造函數/原型方法:? 屬性私有后遮怜,改變各自的屬性不會影響別的對象。同時投放,方法也是由各個對象共享的奈泪。在語義上,這符合了面向對象編程的要求灸芳。
⑥ 動態(tài)原型方法:? 這種方法和 混合的構造函數/原型方法大同小異涝桅。只是將方法的添加放到了構造函數之中,同時在構造函數Person上添加了一個屬性用來保證if語句只能執(zhí)行一次烙样。在實際應用中冯遂,采用的最為廣泛的是 混合的構造函數/原型方法,動態(tài)原型方法也很流行谒获。不要單獨使用構造函數/原型方法蛤肌。