在模块模式中封装“对象工厂”会使对象原型更耗尽内存吗?

时间:2016-06-13 16:35:01

标签: javascript oop encapsulation

我想在揭示模块模式中封装一个“对象工厂”,以隐藏其他程序中的变量等。我的模块创建的对象是否共享同一个prototype实例?即,我每次使用工厂创建新对象时,是否在内存中创建一个新的prototype对象,或者所有对象共享/“看到”相同的原型?

以下是我的代码的简化示例:

var Factory = (function(){
  var uid_seed = 0;
  function TestObject() {
    this.size = 1;
    this.name = "foo";
    this.uid = uid_seed++;
  }
  TestObject.prototype.getName = function() {
    return "Name is: " + this.name;
  };
  return {
    testObject: function() {return new TestObject();}
  }
})();

var arr = [];

for (var i = 1000; i--;) arr.push(Factory.testObject());

当我在这段代码的最后一行创建1000个TestObject对象时,它们每个都有一个消耗内存的原型吗?或者这是一种使用共享原型创建对象的内存效率方法吗?

2 个答案:

答案 0 :(得分:3)

是的,他们确实拥有相同的原型。模块初始化代码仅执行一次,并且仅创建一个原型。您还希望他们都得到不同的%r而不是为每个实例重新评估uid,对吗?

您可以通过选中uid_seed = 0轻松测试。

答案 1 :(得分:1)

简短的回答是:是的,他们共享相同的原型。

稍微长一点的答案是你只定义了一次“类”。当您运行立即调用的函数表达式来创建Factory对象时,这是该函数运行的唯一时间。

这意味着您的TestObjectTestObject.prototype只会生成一次。检查这个的一个简单方法是修改一个实例的原型,看看它是否会改变其他实例。

var Factory = (function(){
  var uid_seed = 0;
  function TestObject() {
    this.size = 1;
    this.name = "foo";
    this.uid = uid_seed++;
  }
  TestObject.prototype.getName = function() {
    return "Name is: " + this.name;
  };
  return {
    testObject: function() {return new TestObject();}
  }
})();

var obj1 = Factory.testObject();
var obj2 = Factory.testObject();

// Original prototype function
console.log(obj1.getName());
console.log(obj2.getName());

// Modify the prototype of the first
obj1.constructor.prototype.getName = function() {
  return "Changed function";
};

// Both objects are affected
console.log(obj1.getName());
console.log(obj2.getName());