Почему некоторые имена атрибутов начинаются с двойного подчеркивания в 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), стандартизированы *:
- В.2.2.2 Object.prototype.
__defineGetter__
(P, геттер) - B.2.2.3 Object.prototype.
__defineSetter__
(П, сеттер) - В.2.2.4 Object.prototype.
__lookupGetter__
(P) - B.2.2.5 Object.prototype.
__lookupSetter__
(P)
*: Следует отметить, однако, что все перечисленные выше разделы определены в Приложении B "Дополнительные функции ECMAScript для веб-браузеров", а в примечании к Приложению B говорится (выделено мной)
В этом приложении описаны различные унаследованные функции и другие характеристики реализаций ECMAScript на основе веб-браузера. Все языковые особенности и поведение, указанные в этом приложении, имеют одну или несколько нежелательных характеристик и в случае отсутствия устаревшего использования будут удалены из этой спецификации. Однако использование этих функций на большом количестве существующих веб-страниц означает, что веб-браузеры должны продолжать их поддерживать. Спецификации в этом приложении определяют требования для совместимых реализаций этих унаследованных функций.
Эти функции не считаются частью основного языка ECMAScript. Программисты не должны использовать или предполагать существование этих функций и поведения при написании нового кода ECMAScript. Реализации ECMAScript не рекомендуется реализовывать эти функции, если реализация не является частью веб-браузера или не требуется для запуска того же устаревшего кода ECMAScript, с которым сталкиваются веб-браузеры.
эффективно осуждают их использование.