javascript - 使用构造函数与闭包创建对象

标签 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

我知道最好的做法是使用构造函数来创建对象,因为这是其基本目的,并且不会让 future 的代码读者感到困惑。我在这里提问的目的是出于好奇。最终结果是否存在某种差异?是对象、内存使用还是其他什么?

最佳答案

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

您没有使用这些功能,因此在您的情况下没有什么区别,但您实际上应该在原型(prototype)上定义 setIdgetId ,这会节省内存(不再需要复制每个实例上的方法)和一点时间(构造函数将完成更少的工作)。

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

关于javascript - 使用构造函数与闭包创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43584224/

相关文章:

c# - View 在从区域中移除后未被处置

javascript - 从对象 setter 访问父 `this`

c++ - 模板化构造函数与模板化复制构造函数

javascript - 获取多个 touchend 事件 javascript

javascript : checking boolean values

c# - 如何创建一个空的对象字段?

java - 当基类有带参数的构造函数时,为什么我不能创建无参数的子类构造函数?

c++ - 显式调用基类析构函数/构造函数是否合法?

Javascript 在字符串标记之间替换 <strong>

javascript - 如何验证在框周围移动的可拖动文本?