@dtestyk

Как сделать базовый объект контейнером верхнего уровня?

Вариант Object=document работает, но только для самого Object, не для его наследников. Насколько я понимаю, нужное мне поведение реализует:Object.prototype=window, но это не работает:
Object.prototype=window
var a={}
console.log(a.document)
//выведет "undefined"
//должно "#document"

Как можно достичь подобного поведения? Если не в браузере, то где такое возможно?
  • Вопрос задан
  • 2368 просмотров
Решения вопроса 1
Ваша цель достижима двумя способами:

Первый позволит Вам писать, так как вы заказывали:
var a = {};
console.log(a.document);

но имейте в виду он опасен. Дело в том, что вы не можете просто так определить window, как прототип для Object - вы получите циклическое наследование - window является объектом типа Object, Object является объектом типа Window. JS просто не позволит Вам такое сделать, поэтому для начала затрем window память о том, что он(а/о) объект
window.__proto__.__proto__.__proto__ = null;
ну и теперь правильно присвоим прототип объекту, будем перезаписывать его null прототип:
Object.prototype.__proto__.__proto__ = window;
Общий рецепт:
window.__proto__.__proto__.__proto__ = null;
Object.prototype.__proto__.__proto__ = window;

var a = {};
console.log(a.document);

НО! Я бы не рекомендовал вам творить подобное, это очень опасно.

Второй вариант короче, безопаснее, но может вам не подойти:

var a = {__proto__:  window};
console.log(a.document);


Остается только понять зачем вам вообще такое понадобилось, возможно есть куда более надежные способы решения проблемы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы