到了ES6時代,我們創建對象的手段又增加了,在不同的場景下我們可以選擇不同的方法來建立。現在就主要有三種方法來構建對象,class關鍵字,構造函數,工廠函數。他們都是創建對象的手段,但是卻又有不同的地方,平時開發時,也需要針對這不同來選擇。
首先我們來看一下,這三種方法是怎樣的
// class 關鍵字,ES6新特性class ClassCar { drive () { console.log('Vroom!'); }}const car1 = new ClassCar();console.log(car1.drive());// 構造函數function ConstructorCar () {}ConstructorCar.prototype.drive = function () { console.log('Vroom!');};const car2 = new ConstructorCar();console.log(car2.drive());// 工廠函數const proto = { drive () { console.log('Vroom!'); }};function factoryCar () { return Object.create(proto);}const car3 = factoryCar();console.log(car3.drive());這些方法都是基于原型的創建,而且都支持在構造時函數中私有變量的實現。換句話來說,這些函數擁有著大部分相同的特性,甚至在很多場景下,他們是等價的。
在 Javascript 中,每一個函數都能返回一個新的對象。當它不是構造函數或者類的時候,它就被稱作工廠函數。
ES6的類其實是構造函數的語法糖(至少現階段是這樣實行的),所以接下來討論的所有內容都適用于構造函數的也適用于ES6類:
class Foo {}console.log(typeof Foo); // function構造函數和ES6類的好處
大部分的書會教你去用類和構造函數 ‘ this ' 是指向新的這個對象的。 一些人喜歡 new 關鍵字的可讀性 也許還會有一些很小的細節方面的差別,但是如果在開發過程中沒有問題的話,也不用太擔心。構造函數和ES6類的壞處
1. 你需要 new 關鍵字
到了ES6,構造函數和類都需要帶 new 關鍵字。
function Foo() { if (!(this instanceof Foo)) { return new Foo(); }}在ES6中,如果你嘗試調用類函數沒有 new 關鍵字就會拋出一個任務。如果你要個不用 new 關鍵字的話,就只能使用工廠函數把它包起來。
2. 實例化過程中的細節暴露給了外界API
所有的調用都緊緊的關聯到了構造器的實現上,如果你需要自己在構造過程中動一些手腳,那就是一個非常麻煩的事情了。
3. 構造器沒有遵守 Open / Closed 法則
因為 new 關鍵字的細節處理,構造器違反 Open / Closed 法則:API應該開放拓展,避免修改。
我曾經質疑過,類和工廠函數是那么的相似,把類函數升級為一個工廠函數也不會有什么影響,不過在JavaScript里面,的確有影響。
如果你開始寫著構造函數或者類,但是寫著寫著,你發現需要工廠函數的靈活性,這個時候你不能簡單的就改改簡單改改函數一走了之。
新聞熱點
疑難解答
圖片精選