__proto__
非推奨;: この機能は非推奨になりました。まだ対応しているブラウザーがあるかもしれませんが、すでに関連するウェブ標準から削除されているか、削除の手続き中であるか、互換性のためだけに残されている可能性があります。使用を避け、できれば既存のコードは更新してください。このページの下部にある互換性一覧表を見て判断してください。この機能は突然動作しなくなる可能性があることに注意してください。
警告: オブジェクトの [[Prototype]] を変更することは、現行の JavaScript エンジンがプロパティアクセスを最適化する性質上、どのブラウザーや JavaScript エンジンでも現在とても遅い処理となります。さらに、継承を変更することの効果は微妙で広範囲に及び、 obj.__proto__ = ... 文に費やされる時間に限らず、[[Prototype]] が変更されたオブジェクトにアクセスするあらゆるコードに及ぶ可能性があります。詳しくは JavaScript engine fundamentals: optimizing prototypes で説明されています。
メモ: __proto__ を使用することは議論の余地があり、推奨されません。その存在と正確な動作は、ウェブの互換性を確実に保持するための古い機能として標準化されただけであり、セキュリティ上のいくつかの課題と足かせを表示しています。対応をよりよくするためには、 Object.getPrototypeOf()/Reflect.getPrototypeOf() や Object.setPrototypeOf()/Reflect.setPrototypeOf() を推奨します。
__proto__ は Object のアクセサープロパティ (ゲッター関数およびセッター関数) で、アクセスされるオブジェクトの内部の [[Prototype]] (オブジェクトまたは null のどちらか)を暴露します。
オブジェクトリテラル定義内で __proto__ プロパティを使用することで、オブジェクトの作成時にオブジェクト [[Prototype]] を設定することができ、 Object.create() の代わりになります。オブジェクト初期化子 / リテラルの構文を参照してください。この構文は標準であり、実装に最適化されており、 Object.prototype.__proto__ とは全く異なります。
対応ブラウザ
| 機能 | デスクトップ | モバイル | ||||
|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Safari | Chrome Android | Safari iOS | |
| 1 | 12 | 1 | 3 | 18 | 1 | |
基本構文
// __proto__ example
// See MDN Web Docs for details ライブデモ
Inspect an object's prototype
Compare __proto__ with Object.getPrototypeOf on a plain object.
Create a simple inheritance chain
Link one object to another prototype and read inherited properties.
Use a null-prototype dictionary
Create a dictionary object without inherited Object.prototype members.
実務での使いどころ
-
__proto__ の活用
非推奨;: この機能は非推奨になりました。
注意点
- 一部のブラウザでのみ対応。使用前にブラウザサポートを確認すること。
アクセシビリティ
- JavaScript による動的更新時は、aria-live リージョンで変更をスクリーンリーダーに通知する。