Несмотря на то, что V8 действительно кеширует много вещей, это не один из тех случаев, о чем свидетельствует следующий код :
> function foo(){ this.bar = function(){ return this.x; }; this.x = Math.random(); }
> var ary = [];
> for(var i=0; i<1000000; i++){ ary.push(new foo()); }
, приведенное выше использует 144 МБ памяти.
> function foo(){ this.x = Math.random(); }
> foo.prototype.bar = function(){ return this.x; }
> var ary = [];
> for(var i=0; i<1000000; i++){ ary.push(new foo()); }
И это использует 68 МБ памяти.
Обратите внимание, что заголовок источника V8 в:
http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/compilation-cache.h?r=5284
Кажется, подразумевает, чтокомпиляция упомянутой функции действительно может быть кэширована:
Кэш компиляции хранит информацию о совместно используемых функциях для скомпилированных скриптов и evals.Информация об общей функции ищется с использованием исходной строки в качестве ключа.Для регулярных выражений данные компиляции кэшируются.
Но тест показывает, что даже если компиляция компилируется, новые объекты все равно создаются, как если бы вы не создавали новые объекты, вы бы сломали JS :)
РЕДАКТИРОВАТЬ
Дальнейший тест:
function foo(){
this.bar = function(){
this.x = '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
return this.x;
};
this.x = Math.random();
}
var ary = [];
for(var i=0; i<1000000; i++){ ary.push(new foo()); }
Использует 144 МБ памяти.Из-за того, что я добавил строку из 100 символов, если бы сама функция не была кэширована, мы использовали бы дополнительные 100 МБ памяти или около того.
Таким образом, приведенное выше означает, что да, сама функция кэшируется,Но он все еще должен быть представлен новым объектом.