淺談 JS 建立物件的 8 種模式

發表於2015-10-16
  • Objct 模式
  • 工廠模式
  • 構造器模式
  • 通過 Function 物件實現
  • prototype 模式
  • 構造器與原型方式的混合模式
  • 動態原型模式
  • 混合工廠模式

1.Object 模式

在 chrome 裡檢視各個新建物件的區別:
圖片描述

可以看出前6種模式建立出來的物件都是一樣的,第七種不同點在於其雖然也為 Object 物件但其無任何屬性(包括沒有任何可以繼承的屬性,因為建立的時候沒有指定其原型)

2.工廠模式

3.構造器模式

使用方法1的問題很明顯,沒辦法是 showDoor 方法重用,每次新建一個物件就要在堆裡新開闢一篇空間.改進如下

上面出現的問題就是語義不夠清除,體現不出類的封裝性,改進為 prototype 模式

4.通過Function物件實現建立物件

我們知道每宣告一個函式實際是建立了一個Function 例項 JS 函式.

5.prototype模式

  • 類通過 prototype 屬性新增的屬性與方法都是繫結在這個類的 prototype 域(實際為一個 Prototype 物件)中,繫結到這個域中的屬性與方法只有一個版本,只會建立一次.
  • 類的例項物件可以直接像呼叫自己的屬性一樣呼叫該類的 prototype 域中的屬性與方法,類可以通過呼叫 prototype 屬性來間接呼叫prototype 域內的屬性與方法.

注意:通過類例項化出物件後物件內無 prototype 屬性,但物件可直接像訪問屬性一樣的訪問類的 prototype 域的內容,例項物件有個私有屬性__proto__,__proto__屬性內含有類的 prototype 域內的屬性與方法

可以看出使用該方法雖然說打打減少了記憶體的浪費,但依舊有問題,某個物件的屬性一旦改變,所有由該類例項化得到的物件的__proto__內屬性值也會跟著變(實為引用),改進如下

6.構造器方式與原型方式的混合模式

這也是常用的建立物件方式之一

7.動態原型模式

這種模式使得定義類像強型別語言例如 java 等語言的定義模式

8.混合工廠模式

由於在 Car6()建構函式內部呼叫了 new 運算子,所以將忽略第二個 new 運算子(位於建構函式之外),
在建構函式內部建立的物件被傳遞迴變數car6,這種方式在物件方法的內部管理方面與經典方式(工廠方法)有著相同的問題.應儘量避免

相關文章