使用Constructor和Closure创建对象

时间:2017-04-24 09:20:09

标签: javascript object constructor closures

问题:下面两个示例的结果对象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

我理解最佳做法是使用构造函数来创建对象,因为这是它的基本目的,并且会使未来的代码阅读器更少混淆。我的问题目的是出于好奇。最终结果有什么不同吗?是对象,内存使用还是别的什么?

2 个答案:

答案 0 :(得分:1)

两个对象都具有相同的属性和方法。但是,使用new MyConstr构造的那个将[[proto]]引用MyConstr.prototype,允许它继承方法和属性。

您没有使用这些功能,因此在您的情况下没有任何区别,但您应该在原型上定义setIdgetId,这样可以节省内存(不再复制方法)每个实例)和一点时间(构造函数会做更少的工作)。

此外,构建实例将允许您使用instanceof运算符。

答案 1 :(得分:0)

在此示例中没有差异,但您可以在实际应用程序中使用不同的用法。

闭包示例通常用于[模块模式] [1]或[揭示模块模式] [2]。

构造函数示例通常用于[构造函数模式] [3]和[原型模式] [4]模式。

在你的情况下,我建议你使用The Prototype Pattern,因为你正在为每个创建的新对象添加getIdsetId函数,相反,你可以节省一些内存添加到原型中。 / p>

另外,您应该考虑使用JavaScript getter和setter代替getIdsetId