49

JavaScript の一部のオブジェクトの一部の属性が 2 つのアンダースコアで始まっているのを目にします。たとえば、 または のような__defineGetter__もの__defineSetter__です__proto__。規約で定義された ECMAScript 仕様ですか? それとも、開発者コミュニティの慣習に過ぎないのでしょうか?

4

3 に答える 3

37

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

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

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

また、「システム定義」の識別子 (プログラマ定義の識別子とは対照的に) に 2 つのアンダースコアを使用するという規則は、長い間使用されてきたため、その規則がいつ「開始」されたのかはわかりません。少なくとも C++ ( http://en.wikipedia.org/wiki/Name_mangling#Simple_exampleを参照)

于 2011-07-01T11:25:35.757 に答える
7

これは、名前の衝突がほとんど起こらないようにするためです。

JavaScript には、誰でも変更またはアクセスできるグローバル名前空間に関するこの問題があります。いくつかのデータ隠蔽技術がありますが、うまくいかないこともあります。

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

$ = "somethingElse";
于 2011-07-01T11:24:44.733 に答える