Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

$ = "somethingElse";