Показать сообщение отдельно
  #2 (permalink)  
Старый 27.03.2018, 19:20
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Единственный способ сделать это — создать ссылки на каждый созданный экземпляр. Вы не можете получить к ним доступ, не создавая такой механизм заранее.

let references = new Set();

let a, b, c;

references.add(a = { a: 1 });
references.add(b = [1, 2, 3]);
references.add(c = new Uint8Array(16));

// теперь есть ссылки на необходимые объекты
console.log(references);


a, b и c из примера выше не несут смысловой нагрузки, ведь если объект создан, то он где-нибудь используется... если только это не анонимный объект, который, например, сразу передаётся в качестве аргумента какой-либо функции.

let references = new Set();

function $(object) {
	references.add(object);
	return object;
}

Object.defineProperty($, "references", {
	get() {
		return references;
	}
});

// это можно оформить как отдельный модуль
// export default $;

//////////////////////////////////////////

$([1, 2, 3]);
$({ a: 1 });
$(new Uint8Array(16));

// теперь есть ссылки на необходимые объекты
console.log($.references);


Другой способ (я предполагаю, что вы не можете этого сделать) — перехватить все действия по созданию объектов (используя контейнерный подход Proxy, с литералами не будет работать, см. ниже) и сохранить список всех объектов в вашем приложении...

При выполнении {} не вызывается конструктор Object. Как описано в спецификации ECMA-262, пункт 12.2.6.7, вызывается абстрактная функция ObjectCreate с аргументом proto, который будет внутренним свойством [[Prototype]] для новосозданного объекта. Т. е. выполненный {} представляет из себя такой же объект, который возвращается при выполнении Object.create(Object.prototype); и представляет из себя { __proto__: Object.prototype }

При вызове new Object() вызывается та же абстрактная функция ObjectCreate, и выполненный new Object() представляет из себя { __proto__: Object.prototype }

Во время выполнения литералов массива, рег. выражения и т. д. соответствующий конструктор не вызывается, вызываютя определённые абстрактные функций, в результате выполнения которых получается, в случае литерала регулярного выражения, объект типа RegExp, который представляет из себя объект { __proto__: RegExp.prototype, lastIndex: 0 } с внутренними свойствами [[RegExpMatcher]], [[OriginalSource]] и [[OriginalFlags]]. Такой же объект получился бы при вызове new RegExp();

У классов типа Array, RegExp, Set и т. д. в определении конструктора нет вызовов конструктора родителя Object, хотя они и наследуют от него.
Ответить с цитированием