2017-04-24 106 views
1

問題:以下兩個示例的結果對象obj是否有任何區別?使用構造函數創建對象vs封閉

閉合例子:

var myClosure = function(paramId) { 
    return { 
    Id : paramId, 
    getId : function() {console.log(this.Id)}, 
    setId : function(sId) {this.Id = sId} 
    }; 
} 
var obj = myClosure(2); 
obj.getId();//outputs 2 
obj.setId(5); 
obj.getId();//outputs 5 

構造例如:

var MyConstr = function(Id) 
{ 
    this.Id = Id; 
    this.getId = function() { console.log(this.Id)}; 
    this.setId = function(sId) {this.Id = sId}; 
} 
var obj = new MyConstr(2); 
obj.getId();//outputs 2 
obj.setId(5); 
obj.getId();//outputs 5 

我明白,這是使用構造函數來創建對象的最佳做法,因爲這是它的根本目的,並且會將未來的代碼閱讀器混淆得更少我的問題目的是出於好奇。最終結果有什麼不同嗎?與物體,內存使用情況或其他內容一起使用?

回答

1

兩個對象都具有相同的屬性和方法。然而,用new MyConstr構建的那個將會有它的[[proto]]引用MyConstr.prototype,允許它繼承方法和屬性。

您沒有使用這些功能,因此它不會影響您的情況,但您應該在原型上實際定義setIdgetId,這樣可以節省內存(不再複製每個實例上的方法)和一點時間(構造函數可以做更少的工作)。

此外,構建實例將允許您使用instanceof運算符。

0

在這個例子中沒有區別,但是你可以在現實世界的應用程序中使用不同的用法。

封閉示例通常用於[模塊模式] [1]或[顯示模塊模式] [2]。

構造函數示例通常用於[The Constructor Pattern] [3]和[Prototype Pattern] [4]模式。

在你的情況下,我會建議使用原型模式,因爲你正在爲每個新創建的對象添加getIdsetId函數,相反,你可以保存一些添加到原型的內存。

另外,您應該考慮使用JavaScript getter和setter來代替getIdsetId

相關問題