我读到,向对象添加函数会占用更多内存,然后将函数添加到对象的原型中。
function Obj() {
this.M = function() { // do something };
}
var o = new Obj();
这个想法是,对于Obj的每个构造,都会创建一个新函数并应用于Obj,从而增加了内存的使用。对于1000个Obj实例,需要创建1000个函数。
function Obj() {
}
Obj.prototype.M = function() { // do something };
var o = new Obj();
对于1000个Obj实例,在这种情况下,只创建一个函数。净总计节省999 * sizeof(M)内存。
这是真的吗?如果是,则以下属于以下类别:
function Obj() {
Obj.prototype.M = function() { // do something };
}
var o = new Obj();
我的直觉告诉我,对于这个例子中的Obj的每个构造,每次都会分配原型。我不确定在这种情况下应该考虑使用内存,因为为原型分配相同的函数只会替换函数而不是为N个实例创建N个副本。
我刚开始使用这个方法来封装成员函数的创建,但是要确保我没做错了。
答案 0 :(得分:2)
function Obj() { Obj.prototype.M = function() { // do something }; } var o = new Obj();
好吧,正如你猜测的那样,这将创建一个匿名函数,并在构造新对象期间将其分配给原型。它只是没有意义,and slightly slower ...除非你实际上捕获了类似于闭包中构造函数的参数,在这种情况下它也是怪异的 - 因为无论当前M()
碰巧是,它仍将与 Obj的所有实例共享:
function Obj(name)
{
Obj.prototype.M = function() { alert("Hello, " + name); }
}
var shog = new Obj("shog");
var josh = new Obj("josh");
shog.M(); // alerts, "Hello, josh"
josh.M(); // alerts, "Hello, josh"
如果你能很好地利用它,我很乐意听到它......
答案 1 :(得分:0)
除了已经提到的内容。如果该闭包具有局部变量的句柄(如构造函数参数),您将看到适度的性能损失。这不仅会像前面提到的海报那样奇怪,而且会阻止引用的变量甚至被垃圾收集