Нет, Chrome и Mozilla реализуют стандартную часть спецификации одинаково.Читайте внимательно:
Object.preventExtensions
только предотвращает добавление собственных свойств.Свойства все еще могут быть добавлены к прототипу объекта.
Все, что связано с .__proto__
, является нестандартным, и Chrome может реализовать это по-другому.Вы показали только, что Chrome реализует детали с .__proto__
по-разному, и, на мой взгляд, более интуитивно: спецификация говорит, что прототип все еще расширяем , поэтому имеет смысл, что вы все равно сможете его мутировать,Тогда возникает вопрос, почему Mozilla реализовала это таким образом ?
Например, следующий код работает одинаково и на Chrome, и на FF:
var fixed = Object.preventExtensions({});
Object.getPrototypeOf(fixed).p = 99;
fixed.p; // 99
Ясно, чтоПрототип все еще изменчив.Это имеет смысл с реализацией Chrome .__proto__
.
. Поэтому, чтобы предотвратить расширения прототипа, сделайте это отдельно:
var fixed = Object.preventExtensions({});
Object.preventExtensions(Object.getPrototypeOf(fixed));
Object.getPrototypeOf(fixed).p = 99; // TypeError: Can't add property p, object is not extensible