@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);


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

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

Похожие вопросы