JavaScript中創建對象的方式有以下這些:
一、 原始的方式
原始方式
若要創建多個實例呢?
二、工廠方式
工廠方式
為函數傳遞參數
工廠方式 --》傳值
問題:每次調用函數 createUser(),都要創建新函數 goHome(),意味著每個對象都有自己的 goHome() 版本。而事實上,每個對象都共享同一個函數
從功能上講,工廠方式解決了重復創建函數對象的問題,但是從語義上講,該函數不太像是對象的方法。
三、構造函數
構造函數方式
與工廠方式的差別:首先在構造函數內沒有創建對象,而是使用 this 關鍵字。使用 new 運算符構造函數時,在執行第一行代碼前先創建一個對象,只有用 this 才能訪問該對象。然后可以直接賦予 this 屬性,默認情況下是構造函數的返回值(不必明確使用 return 運算符)
構造函數方式,看起來更像一般對象的創建方式了,但是就像工廠函數,構造函數會重復生成函數,為每個對象都創建獨立的函數版本。
四、原型方式
利用對象的 prototype 屬性,把它看成創建新對象所依賴的原型
原型方式無構造函數,不能通過給構造函數傳遞參數來初始化屬性的值,且屬性指向的是對象,而不是函數,會導致創建對個對象時,屬性值出現共享。doctor1中修改了patients屬性,而doctor2的patients屬性也同樣發生了修改 。
五、混合的構造函數/原型方式
聯合使用構造函數和原型方式:即用構造函數定義對象的所有非函數屬性,用原型方式定義對象的函數屬性(方法)
六、動態原型方法
七、混合工廠方式
ps:實際與工廠方式沒什么區別,只是使用new 讓看起來像真正的構造函數。
采用哪種方式
如前所述,目前使用最廣泛的是混合的構造函數/原型方式。此外,動態原始方法也很流行,在功能上與構造函數/原型方式等價。可以采用這兩種方式中的任何一種。不過不要單獨使用經典的構造函數或原型方式,因為這樣會給代碼引入問題。