2012年2月を編集:以下の答えはもはや正確ではありません。__proto__は「標準のオプション」としてECMAScript 6に追加されています。つまり、実装する必要はありませんが、実装する場合は、所定のルールセットに従う必要があります。これは現在未解決ですが、少なくともJavaScriptの仕様の一部として正式に組み込まれる予定です。
この質問は、表面上見えるよりもはるかに複雑であり、Javascriptの内部に関する知識に関しては、ほとんどの人の給与水準を超えています。
prototypeオブジェクトのプロパティは、そのオブジェクトの新しい子オブジェクトを作成するときに使用されます。変更してもオブジェクト自体には反映されず、そのオブジェクトが他のオブジェクトのコンストラクターとして使用された場合に反映され、既存のオブジェクトのプロトタイプを変更しても意味がありません。
function myFactory(){};
myFactory.prototype = someOtherObject;
var newChild = new myFactory;
newChild.__proto__ === myFactory.prototype === someOtherObject; //true
オブジェクトには、現在のプロトタイプを指す内部[[prototype]]プロパティがあります。それが機能する方法は、オブジェクトのプロパティが呼び出されるたびに、オブジェクトで始まり、ルートオブジェクトプロトタイプの後に一致が見つかるか、失敗するまで[[プロトタイプ]]チェーンを上に向かっていきます。これは、JavaScriptがオブジェクトの実行時の構築と変更を可能にする方法です。必要なものを探す計画があります。
__proto__プロパティには、いくつかの実装(今ロット)に存在する:任意のMozillaの実装で、私の知っているすべてのWebKitのものを、いくつか他の人を。このプロパティは内部の[[prototype]]プロパティを指し、オブジェクトの作成後の変更を可能にします。この連鎖ルックアップにより、プロパティと関数は即座にプロトタイプに一致するように切り替わります。
この機能は現在標準化されていますが、JavaScriptの必須部分ではありません。サポートする言語では、コードが「最適化されていない」カテゴリに分類される可能性が高くなります。JSエンジンは、コード、特に頻繁にアクセスされる「ホット」コードを分類するために最善を尽くす必要があり、変更__proto__などの凝った操作を行っている場合、コードはまったく最適化されません。
この投稿https://bugzilla.mozilla.org/show_bug.cgi?id=607863では、現在の実装__proto__とそれらの違いについて具体的に説明しています。それは困難で未解決の問題であるため、すべての実装は異なる方法で実行します。a。)構文b。)ホストオブジェクト(技術的にはDOMはJavascriptの外部に存在します)およびc。)を除き、JavaScriptのすべてが変更可能__proto__です。残りは完全にあなたと他のすべての開発者の手に委ねられているので、なぜあなたは__proto__痛い親指のように突き出るのかを見ることができます。
それを__proto__可能にしないと、他の方法では不可能であることが1つあります。実行時のコンストラクターとは別のオブジェクトプロトタイプの指定です。これは重要な使用例であり、__proto__まだ死んでいない主な理由の1つです。Harmonyの策定において真剣な議論のポイントとなったこと、またはまもなくECMAScript 6として知られるようになることは非常に重要です。作成中にオブジェクトのプロトタイプを指定する機能は、Javascriptの次のバージョンの一部となり、これは__proto__の日を示すベルは正式に番号が付けられています。
短期的には、__proto__それをサポートするブラウザーをターゲットにしている場合に使用できます(IEはサポートしていません。IEはサポートしません)。ES6は2013年まで確定されないため、今後10年間はwebkitとmozで動作する可能性があります。
Brendan Eich -re:ES5の新しいObjectメソッドのアプローチ:
申し訳ありませんが... __proto__オブジェクトの初期化子の使用例(つまり、ES5のObject.createに類似した、まだ到達できない新しいオブジェクト)を除いて、設定可能というのはひどい考えです。私はこれを__proto__12年以上前に設定可能に設計および実装して書いています。
...層別化の欠如が問題です(キーを持つJSONデータを検討してください"__proto__")。さらに悪いことに、可変性は、実装がiloopingを回避するために循環プロトタイプチェーンをチェックする必要があることを意味します。[無限再帰の定数チェックが必要です]
最後__proto__に、既存のオブジェクトを変更すると、新しいプロトタイプオブジェクトの非ジェネリックメソッドが壊れる可能性があります。これ__proto__は、設定されているレシーバー(直接)オブジェクトでは機能しない可能性があります。これは単に悪い習慣であり、一般的に意図的なタイプの混乱の一種です。