Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 - Fatal编程技术网

Javascript 特权方法与公共方法、内存和性能注意事项

Javascript 特权方法与公共方法、内存和性能注意事项,javascript,Javascript,我正在重写一个web应用程序,目前整个API的设计方式是所有对象的函数成员都是特权方法。如果我没有误解这些概念,特权方法会浪费内存,因为每个对象的实例都有一个副本,而公共方法会节省内存,因为所有实例只有一个副本。在这之前没问题 但是,我的应用程序上的大多数对象都是(动态创建的)DOM对象。目前看起来大致如下: function DOMObj(parent,tag,x,y,w,h,...){ var obj = document.createElement(tag); . .

我正在重写一个web应用程序,目前整个API的设计方式是所有对象的函数成员都是特权方法。如果我没有误解这些概念,特权方法会浪费内存,因为每个对象的实例都有一个副本,而公共方法会节省内存,因为所有实例只有一个副本。在这之前没问题

但是,我的应用程序上的大多数对象都是(动态创建的)DOM对象。目前看起来大致如下:

function DOMObj(parent,tag,x,y,w,h,...){
   var obj = document.createElement(tag);
   .
   .
   .
   parent.appendChild(obj);
   obj.Method1 = function(){/* some code */}
   obj.Method2 = function(){/* some code */}
   .
   .
   .
   obj.MethodN = function(){/* some code */}
   return obj;
}
.
.
.
txt = DOMObj(document.body,"div",...); 
txt.innerHTML = "some text";
function DOMObj(parent,tag,x,y,w,h,...){
   var obj = document.createElement(tag);
   .
   .
   .
   parent.appendChild(obj);
   this.DOMObj = obj;
}
DOMObj.prototype = {
   Method1: function(){/* some code */},
   Method2: function(){/* some code */},
   .
   .
   .
   MethodN: function(){/* some code */}
}
.
.
.
txt = new DOMObj(document.body,"div",...); 
txt.DOMObj.innerHTML = "some text";
由于DOM本身负责创建对象,因此我不必使用new操作符,但是如果我公开了这些方法,我必须像这样重写它:

function DOMObj(parent,tag,x,y,w,h,...){
   var obj = document.createElement(tag);
   .
   .
   .
   parent.appendChild(obj);
   obj.Method1 = function(){/* some code */}
   obj.Method2 = function(){/* some code */}
   .
   .
   .
   obj.MethodN = function(){/* some code */}
   return obj;
}
.
.
.
txt = DOMObj(document.body,"div",...); 
txt.innerHTML = "some text";
function DOMObj(parent,tag,x,y,w,h,...){
   var obj = document.createElement(tag);
   .
   .
   .
   parent.appendChild(obj);
   this.DOMObj = obj;
}
DOMObj.prototype = {
   Method1: function(){/* some code */},
   Method2: function(){/* some code */},
   .
   .
   .
   MethodN: function(){/* some code */}
}
.
.
.
txt = new DOMObj(document.body,"div",...); 
txt.DOMObj.innerHTML = "some text";
在这种情况下,每次我创建一个新对象时,我都会被迫使用new操作符,这显然会对内存消耗产生影响,但影响有多大?最重要的是,与我将要节省的内存量相比,平衡是正的还是负的

我还将增加一小部分开销(如果你愿意的话,这是不可察觉的),我读了一些人的博客,说公共方法与特权方法相比对性能有积极的影响,但他没有解释假设的原因,也没有显示任何数字来支持他的说法,那么,这个说法是真的吗?如果是的话,这个收益将被我将要添加的开销抵消?还是我还会赢?如果是这样,至少在最慢的智能手机上,它会臭名昭著吗

显然,这个问题的答案取决于所创建对象的数量、方法的数量和Javascript引擎的内部结构,因此我将(几乎)盲目地投入大量精力在一些可以忽略不计或影响巨大的事情上,这似乎不是很聪明,这也让我想到了一个核心问题:“多大才是大?”。或者换句话说,我如何准确计算这样的更改对我的应用程序性能的影响?,是否有执行此类计算所需的信息?。至少我需要知道(基于一些可靠的数据)这样的改变是否值得付出努力


在V8或其他JavaScript引擎内部有经验的人能对此有所了解吗?

你能不能尝试一下这两种方法并对它们进行分析,看看哪种方法使用的内存更少?从来没有想过,但它可能会起作用,让我来检查一下真正的问题是,在收集一些表明这是一个问题的数据之前,你为什么要关心这些数据?不要对不存在的性能问题进行优化。评测可能对性能测量有所帮助,但对于内存使用情况,它并不能提供任何真正有用的信息。@ChrisHayes:我没有性能问题,我正在重写应用程序,所以我只想知道以一种新的方式来做是否值得付出额外的努力。