0

我正在重写一个网络应用程序,目前整个 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";

由于 DOM 本身负责创建对象,因此我不必使用new运算符,但是如果我将方法公开,我将不得不像这样重写它:

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 引擎内部经验的人都可以对此有所了解吗?

4

0 回答 0