在模块模式中封装 "object factory" 是否会使对象原型消耗更多内存?
Does encapsulating an "object factory" in a module pattern make object prototypes more memory consumptive?
我想在显示模块模式中封装一个 "object factory" 以从我的程序的其余部分隐藏变量等。我的模块创建的对象是否共享相同的 prototype
实例?也就是说,每次我用我的工厂创建一个新对象时,我是在内存中创建一个新的 prototype
对象,还是所有对象共享/"see" 相同的原型?
这是我的代码的一个简化示例:
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
对象时,它们是否每个都有一个消耗内存的原型?或者这是一种使用共享原型创建对象的内存高效方式吗?
是的,他们确实有相同的原型。模块初始化代码只执行一次,只创建一个原型。您还希望它们都得到不同的 uid
,而不是为每个实例重新评估 uid_seed = 0
,对吗?
您可以通过检查 Object.getPrototypeOf(arr[0]) === Object.getPrototypeOf(arr[1])
轻松测试。
简短的回答是:是的,它们共享相同的原型。
稍微长一点的答案是你只定义了一次"class"。当您 运行 立即调用函数表达式来创建您的 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());
我想在显示模块模式中封装一个 "object factory" 以从我的程序的其余部分隐藏变量等。我的模块创建的对象是否共享相同的 prototype
实例?也就是说,每次我用我的工厂创建一个新对象时,我是在内存中创建一个新的 prototype
对象,还是所有对象共享/"see" 相同的原型?
这是我的代码的一个简化示例:
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
对象时,它们是否每个都有一个消耗内存的原型?或者这是一种使用共享原型创建对象的内存高效方式吗?
是的,他们确实有相同的原型。模块初始化代码只执行一次,只创建一个原型。您还希望它们都得到不同的 uid
,而不是为每个实例重新评估 uid_seed = 0
,对吗?
您可以通过检查 Object.getPrototypeOf(arr[0]) === Object.getPrototypeOf(arr[1])
轻松测试。
简短的回答是:是的,它们共享相同的原型。
稍微长一点的答案是你只定义了一次"class"。当您 运行 立即调用函数表达式来创建您的 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());