问题:下面两个示例的结果对象obj
有什么不同吗?
关闭示例:
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
我理解最佳做法是使用构造函数来创建对象,因为这是它的基本目的,并且会使未来的代码阅读器更少混淆。我的问题目的是出于好奇。最终结果有什么不同吗?是对象,内存使用还是别的什么?
答案 0 :(得分:1)
两个对象都具有相同的属性和方法。但是,使用new MyConstr
构造的那个将[[proto]]引用MyConstr.prototype,允许它继承方法和属性。
您没有使用这些功能,因此在您的情况下没有任何区别,但您应该在原型上定义setId
和getId
,这样可以节省内存(不再复制方法)每个实例)和一点时间(构造函数会做更少的工作)。
此外,构建实例将允许您使用instanceof
运算符。
答案 1 :(得分:0)
在此示例中没有差异,但您可以在实际应用程序中使用不同的用法。
闭包示例通常用于[模块模式] [1]或[揭示模块模式] [2]。
构造函数示例通常用于[构造函数模式] [3]和[原型模式] [4]模式。
在你的情况下,我建议你使用The Prototype Pattern,因为你正在为每个创建的新对象添加getId
和setId
函数,相反,你可以节省一些内存添加到原型中。 / p>
另外,您应该考虑使用JavaScript getter和setter代替getId
和setId
。