在Javascript中为原型分配函数是否有内存性能优势?

时间:2010-08-23 22:28:09

标签: javascript performance memory prototype

我读到,向对象添加函数会占用更多内存,然后将函数添加到对象的原型中。

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个副本。

我刚开始使用这个方法来封装成员函数的创建,但是要确保我没做错了。

2 个答案:

答案 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)

除了已经提到的内容。如果该闭包具有局部变量的句柄(如构造函数参数),您将看到适度的性能损失。这不仅会像前面提到的海报那样奇怪,而且会阻止引用的变量甚至被垃圾收集