web-dev-qa-db-ja.com

JavaScriptで一部の属性名がダブルアンダースコアで始まるのはなぜですか?

JavaScriptの一部のオブジェクトの一部の属性は、2つの下線で始まっています。たとえば、__defineGetter__または__defineSetter__または__proto__など。規約で定義されたECMAScript仕様ですか?それとも開発者コミュニティの単なる慣例なのでしょうか?

40
Saeed Neamati

これらは特定のブラウザによって定義されたプロパティでありおよびはECMAScriptによって定義されていません。

したがって、 名前の衝突 を回避する必要があります。プロパティがdefineGetterを呼び出した場合、Webサイトのコードが同じ名前のプロパティをまだ定義していないという保証はなく、多くの問題が発生します。ただし、2つのアンダースコアを追加することは、ブラウザー固有のプロパティを定義するための事実上の方法になっています(一部のWebサイトがその規則を使用する可能性ははるかに低いため)。

他のブラウザが他のブラウザと同じ命名規則を使用し始めていることに気付くかもしれません(__proto__を使用するなど)が、すべてのブラウザ間で普遍的に保証されているわけではありません(たとえば、IEは、 __proto__ property)。

また、「プログラマー定義の識別子ではなく」「システム定義」の識別子に2つのアンダースコアを使用するという慣習は、長い間思い起こされます。そのため、いつその慣例が「始まった」のかはわかりません-少なくともC++と同じくらい長くはありません。 ( http://en.wikipedia.org/wiki/Name_mangling#Simple_example を参照)

32
Alexander Bird

これは名前の衝突が起こりそうにないようにするためです。

JavaScriptには、誰でも何でも変更またはアクセスできるグローバル名前空間に関するこの問題があります。いくつかのデータ非表示技術がありますが、機能しない場合があります。

たとえば、これを行うと、jqueryが機能しなくなります。

$ = "somethingElse";
6
Aliostad

答えは更新が必要だと思います。これらの名前はECMA-262の一部になりました。そのため、はい、命名規則はECMAScript仕様で定義されています。

ECMAScript 2015(ES6)以降、以下が標準化されました*:

ECMAScript 2017(ES8)以降、次のものが標準化されました*:

*:ただし、上記のセクションはすべて、付録B「Webブラウザーの追加のECMAScript機能」で定義されており、付録Bに付随する注記が強調されています。

この附属書では、さまざまなレガシー機能と、WebブラウザーベースのECMAScript実装のその他の特性について説明します。この附属書で指定されているすべての言語機能と動作には、1つ以上の望ましくない特性があり、レガシー使用法がない場合、この仕様から削除されますただし、 、多数の既存のWebページによるこれらの機能の使用は、Webブラウザーがそれらを引き続きサポートする必要があることを意味します。この付録の仕様は、これらのレガシー機能の相互運用可能な実装の要件を定義しています。

これらの機能は、コアECMAScript言語の一部とは見なされません。 プログラマは、新しいECMAScriptコードを作成するときに、これらの機能と動作を使用したり、その存在を想定したりしないでください。 ECMAScript実装は、実装がWebブラウザーの一部であるか、Webブラウザーが遭遇するのと同じレガシーECMAScriptコードを実行する必要がある場合を除き、これらの機能の実装は推奨されません。

それらの使用を効果的に非推奨にします。

0
user5532169