Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中为原型分配函数是否有内存性能优势?_Javascript_Performance_Memory_Prototype - Fatal编程技术网

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

在Javascript中为原型分配函数是否有内存性能优势?,javascript,performance,memory,prototype,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 };

我读到向对象添加函数会比向对象原型添加函数占用更多内存

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

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

正如您所猜测的,这将创建一个匿名函数,并在构建新对象期间将其分配给原型。这是毫无意义的。。。除非您在该闭包中实际捕获了类似构造函数参数的内容,否则这种情况也很奇怪-因为无论当前的
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"
如果你能想出一个很好的方法,我很想听听……

另见:

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

@bergi我不确定将其标记为重复是否有意义,因为它是在链接重复之前2年提出的。是的,我将其视为标准问答,所以年龄不重要。因为标题而发现您的问题的用户(是否有内存性能优势?)应该重定向到那里。然而,在“这是真的吗?”,你的实际问题似乎是“我想确定我没有做错事”,关于第三种模式,这实际上是……可能的重复
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"