Почему некоторые имена атрибутов начинаются с двойного подчеркивания в JavaScript?

Я вижу, что некоторые атрибуты некоторых объектов в JavaScript начинаются с двойного подчеркивания. Например, что-то вроде __defineGetter__ или же __defineSetter__ или же __proto__, Это стандартная спецификация ECMAScript? Или, может быть, это просто соглашение в сообществе разработчиков?

2 ответа

Решение

Эти свойства определены конкретным браузером и не определяются ECMAScript.

Следовательно, следует избегать столкновения имен. Если они назвали собственность defineGetterтогда не было бы никакой гарантии, что код веб-сайта еще не определил свойство с таким же именем - и это вызовет много проблем. Тем не менее, добавление двух подчеркиваний стало де-факто способом определения специфических свойств браузера (так как гораздо меньше вероятность того, что некоторые веб-сайты будут использовать это соглашение).

Вы можете заметить, что другие браузеры начинают использовать то же соглашение об именах, что и другие (например, использование __proto__), но это все еще не всегда гарантировано для всех браузеров (например, IE не определяет __proto__ property).

Кроме того: соглашение об использовании двух символов подчеркивания для "определенных системой" идентификаторов (в отличие от идентификаторов, определенных программистом) давно возвращается назад, поэтому я не знаю, когда это соглашение "началось" - по крайней мере, до тех пор, как C++ (см. http://en.wikipedia.org/wiki/Name_mangling)

Это так, что столкновение имен будет очень маловероятным.

У JavaScript есть эта проблема с глобальным пространством имен, которое каждый может изменить или получить к нему доступ. Есть некоторые методы сокрытия данных, но иногда они не работают.

Например, если вы сделаете это, ваш jquery перестанет работать:

$ = "somethingElse";

Я считаю, что ответ требует обновления. Эти имена теперь являются частью ECMA-262, так что да, соглашение об именах теперь определено в спецификации ECMAScript.

Начиная с ECMAScript 2015 (ES6), были стандартизированы *:

Начиная с ECMAScript 2017 (ES8), стандартизированы *:

*: Следует отметить, однако, что все перечисленные выше разделы определены в Приложении B "Дополнительные функции ECMAScript для веб-браузеров", а в примечании к Приложению B говорится (выделено мной)

В этом приложении описаны различные унаследованные функции и другие характеристики реализаций ECMAScript на основе веб-браузера. Все языковые особенности и поведение, указанные в этом приложении, имеют одну или несколько нежелательных характеристик и в случае отсутствия устаревшего использования будут удалены из этой спецификации. Однако использование этих функций на большом количестве существующих веб-страниц означает, что веб-браузеры должны продолжать их поддерживать. Спецификации в этом приложении определяют требования для совместимых реализаций этих унаследованных функций.

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

эффективно осуждают их использование.

Другие вопросы по тегам