【问题标题】:Is there a memory performance benefit of assigning a function to the prototype in Javascript?将函数分配给 Javascript 中的原型是否有内存性能优势?
【发布时间】:2011-04-02 21:42:47
【问题描述】:

我读到向对象添加函数会消耗更多内存,然后向对象的原型添加函数。

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

我刚刚开始使用这种方法来封装成员函数的创建,但想确保我没有做错事。

【问题讨论】:

标签: javascript performance memory prototype


【解决方案1】:
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"

如果你想出一个很好的用途,我很想听听......

另见:

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 2016-03-14
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多