2014-10-01 7 views
0

Возможно ли получить доступ к объектам JS in-memory из кода? Существуют ли инспекторы внутренней памяти? Можно ли перечислить объекты с заданным прототипом (или типом) из кода?Доступ к объектам JavaScript в памяти

// EXAMPLE 
function Kitten(name) { this.name = name; } 
var kitten = new Kitten('furry'); 
// ... 
// Any features like this? 
var kittens = ListObjectsOfType(Kitten); 
// Or this? 
var kittens2 = ListObjectsWithPrototype(kitten.prototype); 

В первую очередь меня интересуют версии V8 от Google или спецификации ES6 (Harmony). (Я также ценю другие технологии.)

+1

Какая реализация JavaScript? Нет стандартного способа сделать это в любом случае – thefourtheye

+0

Я сосредоточен на V8 (Chrome, Node). Я интересуюсь имеющимися в настоящее время технологиями и, если есть какой-либо стандарт ES6, который будет реализован позже –

ответ

0

Вы можете создать функцию для этого. Что-то вроде:

function ListObjectsOfType(type) { 
    var result = []; 
    for(var w in window) { 
     var val = window[w]; 
     if(val instanceof type) 
      result.push(val); 
    } 
    return result; 
} 

Если вы вызываете это с Chrome консоли, вы можете явно проверять/свернуть результирующие объекты. Вы можете расширить его, чтобы пересечь все оконные вары (однако вы хотите пропустить значения по умолчанию). Я думаю, что по определению невозможно проверить, например. следующее:

function SomeObj() { 
    var b = new Kitten('kitty'); 
} 
new SomeObj(); 

Я ожидаю, что куча памяти, чтобы это OBJ, но он не будет доступен/обнаружению с помощью JS когда-либо.

+0

Да, в этом перечислены свойства 'window' (т. Е. Глобальных переменных), но он далеко не является инспектором памяти. Локальные переменные ('function() {var k = new Kitten ('meow')}') и переменные-члены не перечислены здесь. –

+0

Согласовано. Хром Devtools имеет функцию просмотра памяти и ее объектов, но вы не можете проверять ее с помощью функции, насколько мне известно. Этот пример можно расширить, проверив каждый объект, который так или иначе ссылается, но некоторые объекты я считаю по определению недоступными, так как они живут в локальной области. – EricG

Смежные вопросы