我想在揭示模块模式中封装一个“对象工厂”,以隐藏其他程序中的变量等。我的模块创建的对象是否共享同一个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
对象时,它们每个都有一个消耗内存的原型吗?或者这是一种使用共享原型创建对象的内存效率方法吗?
答案 0 :(得分:3)
是的,他们确实拥有相同的原型。模块初始化代码仅执行一次,并且仅创建一个原型。您还希望他们都得到不同的%r
而不是为每个实例重新评估uid
,对吗?
您可以通过选中uid_seed = 0
轻松测试。
答案 1 :(得分:1)
简短的回答是:是的,他们共享相同的原型。
稍微长一点的答案是你只定义了一次“类”。当您运行立即调用的函数表达式来创建Factory对象时,这是该函数运行的唯一时间。
这意味着您的TestObject
和TestObject.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());