Все зависит от того, как вы его используете.
Используя функцию Томаса, фактически сохраняющую сумму для КАЖДОГО объекта, вы также присоединяете его.
Если вы сохраните функцию где-то еще до того, как вставить ее в свой объект, вы будете использовать меньше памяти.
Плохой:
var array = [];
for (i=0; i<100000; i++)
array[i] = { test: function(){ "A pretty long string" }; }
Хороший:
var array = [],
long = function(){ "A pretty long string"; };
for (i=0; i<100000; i++)
array[i] = { test: long }
В моих тестах хороший получил дополнительно ~ 3 МБ, плохой - ~ 20 МБ. Это происходит потому, что вы храните только 100000 ссылок на функцию вместо 100000 анонимных функций.
Подход, на который вы ссылаетесь (основанный на прототипе) в вашем комментарии, может быть закодирован следующим образом:
function wrapper(data){
for (i in data)
this[i] = data[i]; // This is a fast hack
// You will probably want to clone the object, making sure nested objects and array
// got cloned too. In this way, nested objects and array will only get their
// reference copied inside this
}
wrapper.prototype.test = function(){
"A pretty long string";
}
var array = [];
for (i=0; i<100000; i++)
array[i] = new wrapper({})
Память примерно такая же, как и у Хорошего, который я написал ранее, но имеет то преимущество, что мы не загрязняем наш объект именем функции (в нашем примере - test).
Недостатками в основном являются длина, необходимость копировать наши данные и «хак», используемый для копирования (что может быть допустимо в некоторых проектах и совершенно ужасно в других).