¿Por qué algunos nombres de atributos comienzan con doble guión bajo en JavaScript?
double-underscore (2)
Veo que algunos atributos de algunos objetos en JavaScript comienzan con doble guion bajo. Por ejemplo, algo como __defineGetter__
o __defineSetter__
o __proto__
. ¿Es una especificación ECMAScript definida por la convención? ¿O tal vez es solo una convención en la comunidad de desarrolladores?
Estas son propiedades definidas por el navegador específico y no están definidas por ECMAScript .
Por lo tanto, debe evitarse la colisión del nombre . Si llamaban a la propiedad defineGetter
, entonces no habría garantía de que el código del sitio web aún no definiera una propiedad con ese mismo nombre, y eso causaría muchos problemas. Sin embargo, agregar dos guiones bajos se ha convertido en la forma predeterminada de definir propiedades específicas del navegador (ya que es mucho menos probable que algún sitio web use esa convención).
Puede observar que otros navegadores comienzan a usar la misma convención de nomenclatura que otros (como usar __proto__
), pero eso aún no está universalmente garantizado entre todos los navegadores (por ejemplo, IE no define la __proto__ property
).
Además: la convención de usar dos guiones bajos para los identificadores "definidos por el sistema" (en oposición a los identificadores definidos por el programador) se remonta mucho tiempo, por lo que no sé cuándo comenzó esa convención - Al menos mientras C ++ (ver http://en.wikipedia.org/wiki/Name_mangling#Simple_example )
Esto es para que la colisión del nombre sea muy poco probable.
JavaScript tiene este problema con el espacio de nombres global que todos pueden cambiar o acceder a cualquier cosa. Existen algunas técnicas de ocultación de datos pero a veces no funcionan.
Por ejemplo, si haces esto, tu jquery dejará de funcionar:
$ = "somethingElse";