Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Не получается изменить __proto__ у Object.prototype

В MDN говорится
Обратите внимание, что свойство __proto__ может быть переопределено даже у объекта Object.prototype, если новая цепочка заканчивается null
Однако, при попытке выполнить код из примера
var b = {}; Object.prototype.__proto__ = Object.create(null, // [[Prototype]] { hi: { value: function() { alert('hi'); } } }); b.hi();
я получаю ошибку в хроме (версия 63.0.3239.132 x64)
Uncaught TypeError: Immutable prototype object '#' cannot have their prototype set at Object.set __proto__ [as __proto__] () at js:15
и в Firefox'е (версия 58.0 x64)
TypeError: can't set prototype of this object
А вот в IE11 всё работает.
Почему так происходит и можно ли всё-таки изменить этот прототип?


Ответ

Последняя на данный момент спецификация говорит, что
The Object prototype object is the intrinsic object %ObjectPrototype%. The Object prototype object is an immutable prototype exotic object

Это нововведение ES7 (aka ES2016). Встроенный прототип объекта Object.prototype на данный момент Immutable Prototype Exotic Objects у которого внутренний слот [[prototype]] заблокирован.
Предполагается, что это предотвратит вставку посредника в глобальный механизм поиска, см. этот коммит для более детальной информации. Это реализовано в V8
перевод ответа @Bergi

Небольшое пояснение можно найти по ссылкам из issue. В примере
foo,bar,123


В этом примере был вывод: "data=foo" и "data=bar". Позволило бы изменить текущей странице значения используемые в загружаемом скрипте.

Комментариев нет:

Отправить комментарий