hasOwnProperty и строгий режим ECMAScript 5

Мне любопытно: кто-нибудь знает, почему спецификация ECMAScript5 не ужесточила свойства предопределенного прототипа объекта в строгом режиме? Например, кажется, что нет информации о том, как определяется hasOwnProperty. Я попытался переопределить его (и протестировал код в бета-версии FF4), и мне это сошло с рук. Если я не сделал ничего плохого, то это означает, что любой может до сих пор переопределить свойство Object.prototype.hasOwnProperty и реально запороть весь код, который полагается на него для рабочего свойства...

мысли по этому поводу?

РЕДАКТИРОВАТЬ: немного больше информации, когда я копаюсь в спецификации...

Как я уже сказал в комментарии ниже, вы не можете изменить Object.prototype в строгом режиме из-за примененных к нему метаданных (для Writable, Enumerable и Configurable установлено значение false) и бета-версии FF 4 (которую я использую для запуска своих тестов) генерирует исключение.

Благодарю.


person Luis Abreu    schedule 10.01.2011    source источник
comment
Возникает вопрос: запечатаны ли встроенные объекты по умолчанию? Я еще не копался в ES5, поэтому не знаю ответа на этот вопрос.   -  person Šime Vidas    schedule 10.01.2011
comment
@Šime Vidas Нет, встроенные объекты по умолчанию не запечатаны. Их [[Extensible]] имеет значение true, поэтому вы можете легко добавлять к ним свойства (см. раздел 15). AIUI, цель состояла в том, чтобы сохранить гибкость объектной модели ES, заблокировав только абсолютно важные части (например, сделать глобальные свойства undefined, NaN и Infinity недоступными для записи и настройки :))   -  person kangax    schedule 14.01.2011


Ответы (1)


И? Я могу убить все на Object.prototype, если захочу, не включайте такой код в свой проект/сайт, не делайте что-то лучше, найдите тех идиотов, которые делают такие вещи, и не забудьте дать им по яйцам.

Я имею в виду, что я могу даже испортить любую программу на Python (2.x), выполнив True = False.

От идиотов никогда не защитишься. Никогда. Попробуйте воспитать или избежать их.

ИЗМЕНИТЬ

Чтобы прояснить невозможность этого, если вы инкапсулируете свой сценарий в анонимную оболочку (как вы должны сделать, если вы используете его с другим кодом), "use strict" будет локальным для вашего кода.

Это означает, что если код злого идиота не использует строгий режим сам по себе - а они не будут... если только они не полные идиоты, о которых я здесь не говорю - они работают в ES3 и вашей прекрасной строгости даже не существует.

person Ivo Wetzel    schedule 10.01.2011
comment
Никогда не спорьте с идиотами, они опустят вас до своего уровня и задавят опытом - person qwertymk; 10.01.2011
comment
Ну не совсем. Глядя на спецификацию, я вижу, что Object.prototype имеет следующие атрибуты: Writable: false, enumerable: false и configurable: false. Я также пытался изменить его и заметил, что FF генерирует исключение, если вы пытаетесь это сделать. - person Luis Abreu; 10.01.2011
comment
@Luis Думаю, я использовал неправильную формулировку, я могу просто удалить из нее все свойства, только свойство prototype из Object нельзя переопределить. - person Ivo Wetzel; 10.01.2011
comment
ок, понял. В любом случае, мне все еще интересно узнать, почему спецификация не зашла так далеко. важно ли иметь свойство прототипа? Да, это. Важно ли иметь некоторые ненастраиваемые, недоступные для записи унаследованные свойства, такие как hasOwnProperty? Я говорю «да», но мне действительно любопытно понять причину отказа от принуждения к такому поведению. - person Luis Abreu; 10.01.2011
comment
@Luis Понятия не имею, почему они всего этого не сделали, думаю, если бы они захотели, им пришлось бы изменить ES3, и наверняка есть код, основанный на том факте, что вы можете перезаписать встроенные функции ... и, к сожалению, они действительно заботитесь о том, чтобы не сломать этот код:/ - person Ivo Wetzel; 10.01.2011