web-dev-qa-db-ja.com

JavaScriptの[[prototype]]プロパティの二重括弧の意味は何ですか?

すべてのJavaScriptオブジェクトには[[Prototype]]という内部プロパティがあることを私は知っています。一部の実装では、__proto__というプロパティを介してアクセスできますが、許可しない実装もあります。このプロパティを囲む括弧の特別な意味はありますか?

39
Geek

オブジェクトの「内部プロパティ」です。から ECMAScript 8.6.2

この仕様では、さまざまな内部プロパティを使用して、オブジェクト値のセマンティクスを定義します。 これらの内部プロパティはECMAScript言語の一部ではありません。これらは純粋に説明目的でこの仕様によって定義されています。 ECMAScriptの実装は、ここで説明する方法で内部プロパティを生成および操作するかのように動作する必要があります。 内部プロパティの名前は二重角括弧[[]]で囲まれています。

「これらの内部プロパティはECMAScript言語の一部ではありません」というステートメントは、内部プロパティが実際のコードで使用できる識別子ではないことを意味します。内部プロパティは、それらを含むオブジェクトのメンバーとしてアクセスできません。ただし、それらはmay特定の関数またはプロパティからアクセス可能になります(たとえば、一部のブラウザは、[[Prototype]]を設定して取得できるほど親切です。 __proto__プロパティを介して、ES5仕様はObject.getPrototypeOfを介して読み取り専用アクセスを許可します。

シングルブラケットよりもダブルブラケットを使用することは、実際の ブラケット表記 (つまり、プロパティアクセス)との混同を避けるためです。

42
apsillers

JavaScript [[プロトタイプ]]

二重角かっこ[[Prototype]]は、あるオブジェクトを別のオブジェクトに結び付ける内部リンケージです。

関数を作成すると、prototypeというプロパティオブジェクトが作成され、関数の名前変数(constructorと呼びます)に追加されます。このオブジェクトは、ネイティブJavaScriptオブジェクトを指しているか、ネイティブJavaScriptオブジェクトへの内部プライベートリンクを持っています。

例:

function Foo () {
    this.name = 'John Doe';
}

// Foo has an object 'property' called prototype 
// prototype was created automatically when we declared the function Foo.
// Now, we can assign properties to it without declaring the prototype object first.
Foo.prototype.myName = function () {
    return 'My name is ' + this.name;
}

ここで、Fooキーワードを使用してnewから新しいオブジェクトを作成する場合、基本的に(とりわけ)関数のプロトタイプへの内部リンクを持つ新しいオブジェクトを作成します(Foo)前に説明しました:

var obj = new Foo();

obj.__proto__ === Foo.prototype      // true
obj.[[Prototype]] === Foo.prototype  // true

なので

obj.__proto__ === obj.[[Prototype]]  // true

[[Prototype]]はその関数のオブジェクトへのプライベートリンケージであるため、多くのブラウザーが代わりにパブリックリンケージを提供しています。それが__proto__(ダンダープロトと発音)です。

__proto__は実際には getter 関数であり、ネイティブJavaScriptオブジェクトに属し、thisバインディングが何であれ(obj[[Prototype]]を返します)の内部とプライベートのプロトタイプリンケージを返します。 )::

obj.__proto__ === Foo.prototype // true

ところで、ES5から始めて、getPrototypeOfメソッドを使用して内部プライベートリンケージを取得できます。

obj.__proto__ === Object.getPrototypeOf(obj) // true

注:この回答は、新しいオブジェクトまたは新しいコンストラクターを作成するプロセス全体をカバーすることを意図していませんが、[[Prototype]]とは何か、およびその方法をよりよく理解するのに役立ちますできます。

10
Lior Elrom

括弧内にある理由は、それが私有財産であることを示すためです。角かっこ自体がコードで使用されることはありません。

ご指摘のとおり、一部の実装では__proto__の下でそのプライベートプロパティへのアクセスが提供されますが、これは非標準です。

9
Joseph Silber